无法在 Django 视图中获取子进程输出

Posted

技术标签:

【中文标题】无法在 Django 视图中获取子进程输出【英文标题】:Cannot get subprocess output in Django view 【发布时间】:2017-06-29 17:11:10 【问题描述】:

我想在 Django 视图中模拟我的脚本(TensorFlow 神经聊天机器人模型)的命令行调用,并从控制台获取输出到变量。

当我在我的服务器终端手动操作时:

python3 var/www/engine/chatbot/udc_predict.py --model_dir=var/www/engine/chatbot/runs/1486057482/

输出很好,打印出来了。

所以在我的 Django 视图中我会这样做:

        import subprocess
        answer = subprocess.check_output(['python3', 'var/www/engine/chatbot/udc_predict.py','--model_dir=var/www/engine/chatbot/runs/1486057482/'], shell=True, stderr=subprocess.STDOUT, timeout=None)
        print('answer', answer)

并且answer 变量在 Apache 错误日志中打印为 b''

我无法弄清楚我的电话出了什么问题。

【问题讨论】:

尝试将stdout=subprocess.PIPE 传递给subprocess.check_output() 调用 @ZdaR 你的评论让我不得不去解决 【参考方案1】:

答案是使用 .communicate() 和 PIPE:

        from subprocess import Popen, PIPE
        proc = Popen(
            "python3 var/www/engine/chatbot/udc_predict.py --model_dir=var/www/engine/chatbot/runs/1486057482/",
            shell=True,
            stdout=PIPE, stderr=PIPE
        )
        proc.wait()    
        res = proc.communicate() 
        if proc.returncode:
            print(res[1])
        print('result:', res[0])
        answer = res[0]

【讨论】:

以上是关于无法在 Django 视图中获取子进程输出的主要内容,如果未能解决你的问题,请参考以下文章

处理子进程文件输出

如何获取子进程的输出

如何在 Views.py 中运行子进程——Django

在视图中获取 virtualenv 或 python 路径

golang如何获取子进程的实时输出

从 python 子进程获取输出并向其发出命令