title: python中shell调用
date: 2018-07-18 22:28:30
updated: 2020-03-09 15:37:05
categories: python
tags:
- python


python前后端调用另辟蹊径–shell脚本调用

再经过了前面的flask前后端调用的一天bug洗礼后,有个问题仍旧难以解决,大概就是flask是python的web服务,理论上来说是要打开网页进行交互,网页与后台传参也可以用上述的ajax传递。但是,鄙人的这个神奇的项目需求是要我有起点终点,现在调用百度api,返回地图规划路径,但是调用过程中不能用鼠标单击网页api,自动|后台|悄悄的调用,我只要得到返回的规划路径str就可以了,谁要你打开网页显示出来路径的信息啊,只要文字不要二维的路径图案。于是乎,我先后尝试了

1.基于flask框架下的ajax传参,gg:不打开网页,但是网页是动态的,必须打开才可以ajax获取

2.基于flask框架下,在路由index()方法中用多进程的方式分别调用百度api、获取api计算后的str路径,gg:因为index()必须返回页面,而这个页面正是我index()方法中要调用的,脑袋疼。。。

3.基于flask框架下,在flask的main方法下写,gg: 神奇的flask在调用app.run()后根本他么不执行后面的语句,原因后想也比较好理解,因为是flask啊,启动后就是web服务啊,要什么main函数后面的逻辑。。。

4.还有些其他很小的尝试,均失败无法实现,关键这个需求还很难描述百度,吃饭回来后冷静下来好好想了想,发现就是两步调用百度api、获取api计算后的str路径,而这两步我都实现了,只是被神奇的flask羁绊住了,只是因为后期有个需求需要用flask,我还不能更换框架,于是,无意中我知道python调用Shell脚本的有两种方法:os.system(cmd)或os.popen(cmd),然后直接将上述两步写到两个脚本,用总得main去调用执行这两个脚本即可,细节介绍如下,脑瓜疼了半天终于解决了~

python调用Shell脚本

有两种方法:os.system(cmd) 或 os.popen(cmd)

前者返回值是脚本的退出状态码0、1;后者的返回值是脚本执行过程中的输出内容。下面是示例:

#先运行flask调用百度api的脚本
os.system("python init.py&")
time.sleep(3)
    
#再访问http://127.0.0.1:5000页面,得到目标字符串data.readline()
data = os.popen("python init2.py")
print(data.readline())
	
#终止os.system后台调用的程序
os.system("pkill python init.py&")

前端JSON解析–JSON.parse

var data = '{"staff": 123, "asd":"asd"}';
var jsonobj = JSON.parse(data); 
alert(obj.staff);

JSON格式化和校验工具:JSONLint