【问题标题】:Running subprocess on linux server doesn't work but works locally on Windows在 linux 服务器上运行子进程不起作用,但在 Windows 上本地运行
【发布时间】:2018-03-22 12:20:15
【问题描述】:

运行子进程在 Windows 上本地工作,但当我在 linux 机器上添加脚本并运行它时不起作用。确实创建了一个子进程对象,但它只是挂起并在那里等待。

这是我正在运行的脚本:

p = subprocess.Popen(["php", "random.php", username, password], stdout=subprocess.PIPE, shell=True)

p.wait()

我查看了 php ini,禁用了功能,但它是空的。我尝试添加 a = p.communicate()print a 但这不会打印任何内容

我能做的事情已经不多了,我还能做些什么来调试它为什么不起作用?

谢谢

【问题讨论】:

  • 一种调试方法是尝试读取p.stdout(标准输出),并检查p.wait()返回的返回码。另外,如果可能,请尝试摆脱shell=True(在Windows 上尝试where php,在Linux 上尝试which php,它们可能是2 种不同的对象类型(.bat/.exe...)
  • 尝试使用communicate.... The docs say Warning: This will deadlock when using stdout=PIPE and/or stderr=PIPE .... 并建议使用communicate 来避免这个问题。
  • @sytech 在将 stdout 和 stderr 都重定向到 PIPE 而不使用 communicate 时出现死锁。哦,但你是对的(我并不是在暗示其他情况:如果你重定向,读取输出)

标签: python python-2.7 subprocess


【解决方案1】:

一个好的线索是进程阻塞,因为您正在使用重定向,但不消耗输出。根据操作系统和缓冲区大小,这可能有效,也可能无效。

如果进程结束时没有输出太多输出管道没有填满,它会工作,否则它会阻塞。

您似乎不想要输出,您只是想让过程安静。在这种情况下,不要使用subprocess.PIPE

重定向

Python 3 有 subprocess.DEVNULL

p = subprocess.Popen(["php", "random.php", username, password], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

Python 2 没有,但你可以伪造它

with open(os.devnull,"w") as f:
   p = subprocess.Popen(["php", "random.php", username, password], stdout=f, stderr=f)

然后:

rc =p.wait()

检查返回码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2018-05-24
    • 2016-09-10
    • 2018-08-16
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多