从subprocess.Popen启动时,Drush挂起

时间:2017-08-29 21:10:27

标签: python linux bash

我正在尝试将一个很长的bash命令传递给我的Popen命令。命令就是这个 -

'/usr/local/bin/drush --alias-path=/data/scripts/drush_aliases @test pml -y | /bin/grep -i dblog | /bin/grep -i enabled'

一次传递整个命令时,Popen命令不会在Cron中返回正确的输出。为了解决这个问题,我试图将它拆分为一个列表(如“命令”中所示),并将其传递给它以解决问题。

在我的完整代码中,我将几个不同的Popen对象链接在一起。但是,我的错误只能通过以下方式重现:

command = ['/usr/local/bin/drush', '--alias-path=/data/scripts/drush_aliases', '@test', 'pml', '-y']

try:
   process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
   output = process.communicate()

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

进程挂起的最常见原因之一是它是否尝试从stdin读取输入。

你可以通过在stdin上显式传递一个封闭的管道(或/dev/null上的句柄)来解决这个问题:

   process = subprocess.Popen(command,
       stdout=subprocess.PIPE,
       stderr=subprocess.PIPE,
       stdin=subprocess.PIPE)  ## this is new

communicate()在写入作为参数传递给它的任何内容后,将关闭传递给stdin的管道,防止进程挂起。

在Python 3.2或更高版本中,您还可以使用stdin=subprocess.DEVNULL