Flask中的Popen启动Python解释器

时间:2016-11-02 19:30:48

标签: python flask subprocess

我尝试通过Flask端点流式传输脚本{4}的stdout。

我使用this SO回答作为我的起点。那个脚本对我很好。这里的代码与答案几乎没有变化,除了调用Python脚本而不是" dmesg"直接

myscript.py

myscript.py

@app.route('/yield')
def index():
     def inner():
         proc = subprocess.Popen(
            ['python', 'myscript.py'],             
            shell=True,
            stdout=subprocess.PIPE
        )

        for line in iter(proc.stdout.readline,''):
            time.sleep(1)                          
            yield line.rstrip() + '<br/>\n'

    return Flask.Response(inner(), mimetype='text/html') 

当我导航到&#34; / yield&#34;在我的浏览器中,我得到一个&#34;此页面无法到达&#34;错误,烧瓶测试服务器进入Python解释器(见下文),没有其他事情发生。

import subprocess
def main():
    subprocess.Popen(['dmesg'], shell=True, stdout=subprocess.PIPE)

if __name__ == '__main__':
    main()

我可以在上面修改一下Python脚本来通过Flask进行流式处理吗?

1 个答案:

答案 0 :(得分:1)

您正在调用python可执行文件,它始终会启动解释程序。您可能需要直接调用您正在使用的可执行文件。我并不是非常熟悉Flask,但我认为它实际上运行的是WSGI应用程序,如果您正在使用虚拟环境或其他东西,那么您打开的外壳会赢得#39 ; t知道虚拟Python的位置,因为路径是动态设置的。像这样的东西将得到正确的可执行路径:

import sys

try:
    import uwsgi
    ex = os.path.join(uwsgi.opt['home'], 'bin/python') # or some default location
except (ImportError, KeyError):
    ex = sys.executable

然后致电:

 proc = subprocess.Popen(
    [ex,  'myscript.py'],             
    shell=True,
    stdout=subprocess.PIPE
 )

现在,这可能无法解决您的问题。似乎脚本没有作为shell的参数正确传递。您可能希望在默认解释器中弄乱它或者仔细检查它调用的命令是否正确。或者,您应该能够摆脱不分离参数:

 proc = subprocess.Popen(
    ['python myscript.py'],             
    shell=True,
    stdout=subprocess.PIPE
 )