【问题标题】:python subprocess communicate hangs calling shell scriptpython子进程通信挂起调用shell脚本
【发布时间】:2012-06-04 04:36:10
【问题描述】:

使用python 3.2,以及如下代码sn-p:

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' 结束,它们毫无问题地返回命令提示符。

【问题讨论】:

  • 可能是您的脚本正在做的事情(产生另一个进程)?
  • 我的代码片段调用了各种shell脚本。它们要么启动一个新进程,要么停止一个现有进程。有些工作,有些不工作。但在所有情况下,shell 脚本都可以在命令提示符下运行良好,不会产生任何错误,并且会执行应有的操作。我试图自动调用我们现有的生产脚本,所以对它们进行更改是不可能的。
  • 我并不是建议您进行任何更改,我只是给您一个提示,一些需要寻找的东西,这可能有助于您确定问题的原因。

标签: subprocess python-3.2


【解决方案1】:

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

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

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

编辑

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

【讨论】:

  • 好吧,如果 shell 脚本永远不会返回到命令提示符,我希望我的 python 脚本也会这样做。但事实并非如此。所有的 shell 脚本在完成后都会返回到命令提示符。
  • 如果标准输入和标准输出连接到管道而不是控制台(tty),程序可能会改变它们的行为;最值得注意的是,缓冲行为发生了变化,但也可能是其他不同的事情。所以你描述的情况并不那么令人惊讶。
猜你喜欢
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2013-09-26
  • 1970-01-01
  • 2021-06-08
相关资源
最近更新 更多