【问题标题】:Flask execute and synchronize python subprocess that spawns another subprocessFlask 执行和同步生成另一个子进程的 python 子进程
【发布时间】:2021-09-13 02:01:54
【问题描述】:

我正在构建一个 Flask 应用程序,它允许用户执行 python 脚本并在 http 响应的正文中查看其输出。

以下代码有效,但我无法将子进程的输出返回给父进程,以便返回带有脚本输出的 html 响应。

例如,在app.py 文件中,我使用以下代码来运行执行客户端请求的python 脚本的子进程。

@app.route('/scripts/<script_name>')
def exec_script(script_name):
    if os.path.isfile(os.path.join(app.config['SCRIPT_FOLDER'], script_name)):
    result = subprocess.run(['python', os.path.join(app.config['SCRIPT_FOLDER'], script_name)], stdout=subprocess.PIPE, cwd=app.config['SCRIPT_FOLDER'])
    print(result.stdout.decode('utf-8'))



# return HTML_PAGE

假设请求的脚本example.py产生了一个执行shell命令的进程,我无法将shell命令的输出传递给app.py中运行的进程

example.py

import subprocess
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)

我猜发生这种情况的原因是app.py 中创建的进程在脚本中创建的进程之前完成。有没有办法将 shell 命令输出重定向到主应用程序?

【问题讨论】:

    标签: python flask subprocess


    【解决方案1】:

    您可以使用subprocess.check_output

    示例:

    result = subprocess.check_output(['ls', '-l'])
    if result is not None:
        print(result.decode('utf-8'))
    

    否则你也可以试试subprocess.Popen:

    result = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0]
    

    或:

    p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    result, err = p.communicate()
    print(result.decode('utf-8'))
    

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      相关资源
      最近更新 更多