subprocess 模块执行外部命令并获取它的输出&& TypeError: Object of type 'bytes' is not JSON serializable
程序员文章站
2024-01-14 19:29:28
...
subprocess 模块执行外部命令并获取它的输出
学习背景
笔者是在使用Vue+Django 做网页时,前端发送请求给后端,需要后端对该请求做处理,之后将处理后的结果返回给前端。如下图所示:在输入框里写入检测域名,点击‘检测’按钮后,后端执行python脚本将得到的结果返回给前端,然后展示在文本域中。
解决方法
1. subprocess.call(dga_check_f, shell=True)
这条语句可能是最熟悉的了,但是这样做只能在终端执行脚本程序,程序执行后无返回值,也就是不能返回对域名的判断结果,导致不能将结果展示在页面。
于是,查阅文档,另辟蹊径。
2. p = subprocess.Popen(dga_check_f, stdout=subprocess.PIPE)
p = subprocess.Popen(dga_check_f, stdout=subprocess.PIPE)
print(p.communicate())
法二也是可以解决的,这里重点说下方法三。
3. subprocess.check_output()
使用subprocess.check_output()是可以得到返回值。先看相关代码:
dga_check = "E:\\Users\****\\" \
"untitled3\dga_detection_plus\evaluate.py"
dga_check_f = 'python' + ' ' + dga_check + ' ' +\
'-u' + ' ' + 'baidu.com'
print(dga_check_f)
dga1 = subprocess.check_output(dga_check_f, shell=True)
运行后结果:
Python version: 3.6.8
python E:\Users\****\evaluate.py -u baidu.com
b'baidu.com\tlegit\t[0.15, 0.85]\r\n'
到这里就成功解决了,但是我在本地测试成功,从后端往前端传送时会报错又遇到的其他问题。这里也一并说说解决方案。
新的问题-TypeError: Object of type ‘bytes’ is not JSON serializable
按照给的提示,大意就是:所给字符串中有不符合json格式的字符。于是,我们对其进行json序列化处理。
#要转化成json就‘dump’,要从json转化成Python就‘load’
response['list'] = json.dumps(dga_result)
成功解决。