subprocess 模块执行外部命令并获取它的输出&& TypeError: Object of type 'bytes' is not JSON serializable

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)

成功解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值