我正在尝试将一个很长的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()
导致这种情况的原因是什么?
答案 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
。