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

Posted

技术标签:

【中文标题】如何在 Views.py 中运行子进程——Django【英文标题】:How to Run Subprocess in Views.py -- Django 【发布时间】:2019-07-26 00:59:29 【问题描述】:

我正在尝试使用从用户生成的 symbol 参数运行具有源 scripts/earnings.py 的脚本。输出是一个 matplotlib 图表,我试图将其放入我的模板中。

from django.shortcuts import render
import subprocess
from backtests.scripts import earnings

def index(request):

    if 'symbol' in request.GET:
        symbol = request.GET.get('symbol','Invalid Symbol')
        request.session['symbol'] = symbol
    else:
        symbol = request.session['symbol']


    process = subprocess.run(["python earnings", "symbol"], stdout=subprocess.PIPE)

    output = process.stdout

    return render(request, 'backtests/earnings.html', 'symbol' : symbol, 'output' : output)

到目前为止,我得到了错误

FileNotFoundError: [Errno 2] 没有这样的文件或目录:'python 收入':'python 收入'

【问题讨论】:

earnings.py导入你正在运行的python函数并直接调用该函数,然后使用该函数的返回值不是更容易吗? 我很确定这是路径问题。试试["python scripts/earnings.py", "symbol"] @dirkgroten 取决于脚本的编写方式,它可能会保持全局状态,不适合导入到长时间运行的进程中 【参考方案1】:

调用subprocess.run 的正确方法是将命令的每个部分作为单独的列表条目:

    process = subprocess.run(["python", "earnings.py", "symbol"], stdout=subprocess.PIPE)

正如@Bestastttung 评论的那样,您的路径也可能是错误的。试试scripts/earnings.py,或者文件的绝对路径。

【讨论】:

是的,但我仍然认为收益.py 的路径会有问题,因为 root_path 不在 /scripts 中,而文件收益.py 所在的位置。 @Bestasttung 你是对的,添加到答案中

以上是关于如何在 Views.py 中运行子进程——Django的主要内容,如果未能解决你的问题,请参考以下文章

Django--视图层(views)

Django:如何通过views.py更改值

如何在views.py中制作频道客户端?

如何在 Django 中重复调用 views.py 中的函数?

Python(四十六)url路由分配及模板渲染方式

如何在 django views.py 中随机播放列表?