python子进程通信挂起调用shell脚本

时间:2012-05-29 22:54:12

标签: subprocess python-3.2

使用python 3.2和以下代码片段:

p = subprocess.Popen(['../start_server.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = p.communicate()

if out != None :
   out = out.decode('utf-8')
if err != None :
   err = err.decode('utf-8')

print('out ',out)
print('err ',err)

在一些shell脚本上,它工作得很好,我得到了我的输出。在别人身上它只是挂起。但在每种情况下,shell脚本都从命令行运行而没有错误。我能看到的唯一共性是(通常)挂起的零输出。当东西失败时,我检查正在运行的进程,我看到我的shell脚本没有列出,python脚本仍在运行

调用shell脚本的可靠方法是什么?总是将控制权返回给我的python程序?


修改:

使用管道Popen等不是必需的,唯一的要求是当shell脚本退出时控件返回到我的python脚本。如果shell脚本永远不会返回到命令提示符,那么我的python脚本也将永远不会返回。

因此假设我调用的shell脚本总是返回命令提示符,如何控制回我的python程序?
如果有一个比上面列出的更好的方式 - 请赐教我

我发现另外一点是“挂起”的shell脚本似乎以“nohup”调用结束。他们返回命令提示符时没有问题。

1 个答案:

答案 0 :(得分:0)

  

什么是调用shell脚本并始终返回控制的可靠方法   到我的python程序?

如果您使用的是管道,这将取决于您的脚本;更一般的答案基本上是halting problem,即使强大的StackOverflow也无法帮助你。

我鼓励您深入挖掘并尝试创建一个可重现的案例,以便我们可以帮助您解决您所看到的特定问题。

修改

如果您不需要管道,那么只需省略stdout和stderr参数(或将它们设置为PIPE以外的其他参数)。请参阅python subprocess management