【问题标题】:Using Python subprocess doesn't work, but calling directly in the shell does使用 Python 子进程不起作用,但在 shell 中直接调用可以
【发布时间】:2015-07-07 14:56:31
【问题描述】:

我正在尝试从 Flask 路由运行子进程,但出现 500 错误。当我直接从 shell 运行它时它可以工作。为什么它不起作用?

import subprocess
from flask import Flask
app = Flask(__name__)

@app.route('/status/<vmid>')
def status(vmid):
    cmd = "/usr/bin/virsh list --all | grep kvm%s | awk {'print $3'}" % vmid
    p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    out,err = p.communicate()
    return out

if __name__ == '__main__':
    app.run(host='0.0.0.0')

通过 Flask 运行时会引发 500 错误:

root@nc2-kvm:~# python status.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
(500 error)

直接在shell中运行时有效:

root@nc2-kvm:~# virsh list --all | grep kvm180 | awk {'print $3'}
running

【问题讨论】:

  • 是因为您没有来自该视图的return 任何 http 响应吗?
  • 在最终代码中,我做了一些更改,例如设置 int(vmid),将其锁定到主服务器的 IP,并在执行任何命令之前对其添加密钥检查 :)

标签: python flask subprocess


【解决方案1】:

看看

https://docs.python.org/2/library/subprocess.html

要使 subprocess.call 以您使用的形式工作,您需要将 shell 参数设置为 True。为确保它正常工作,只需先在 python REPL 中尝试您的 subprocess.call。

【讨论】:

  • @ArjitChaudhary:不要使用shell=True。您编写的代码允许互联网上的任何人在您的机器上以root 运行任何命令。
  • @pvg:不推荐危险的解决方案而没有一点肥胖的免责声明。或者(更好)建议一个更安全的选择,例如用 Python 重写 grepawk 部分或 emulating the pipeline using plumbum
  • @J.F.Sebastian 链接的文档反复包含红色横幅中的免责声明。问题是询问本质上危险的代码/实现,大概是针对某些内部工具。似乎回答这个问题比责备提问的人更有用。
  • 在最终代码中,我做了一些更改,例如设置 int(vmid),将其锁定到主服务器的 IP,并在执行任何命令之前对其添加密钥检查 :)
  • 如果有兴趣,这里是最终代码,github.com/arjitc/virsh-remote-getstatus
猜你喜欢
  • 2014-10-17
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2013-10-15
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多