【问题标题】:subprocess.Popen does not execute all lines of a shell scriptsubprocess.Popen 不会执行 shell 脚本的所有行
【发布时间】:2012-01-26 23:28:14
【问题描述】:

代码:

proc=subprocess.Popen(['sh',shFile],stderr=subprocess.PIPE,stdout=subprocess.PIPE)

out,err = proc.communicate()

问题:

第 1 行中的

shFile 运行多个 shell 脚本。当我从 bash 执行 shFile 时,所有的 shell 脚本都会被执行。但是,当我使用 subprocess.Popen 执行它时,不会执行最后一个 shell 脚本。有趣的是,shFile 的最后一行是“echo 'Done'”,它会被执行。

shFile的最后6行是:

sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__20_eval.sh
sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__5_eval.sh
sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__20_eval.sh
sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__15_eval.sh
sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__10_eval.sh
echo "Done"

只有decoder__10_eval.sh 没有被执行。如果我更改脚本的顺序,最后一个将再次无法执行。

【问题讨论】:

  • 我能够确定问题所在,我在编写最后一个解码器__脚本后未能关闭文件。因此,子进程试图在脚本完全编写之前运行它。

标签: python shell subprocess


【解决方案1】:

subprocess 没有任何魔法。请注意,sh 在现代 Linux 系统上通常不是 bash,而是像 dash 这样的轻量级 shell。如果您的 shell 脚本是特定于 bash 的,那么您需要将 'sh' 更改为 'bash'

在任何情况下,sh(或bash)“忘记”在一个脚本。还要确保 shFile 是您所期望的。

查看更新后的脚本,几乎可以肯定错误出在您评估的脚本中。例如,它们可能只是用完临时文件或其他无意共享的资源。请发布decoder__ 脚​​本,或使用包含以下内容的 shFile 重现问题:

/bin/echo sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__20_eval.sh
/bin/echo sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__5_eval.sh
/bin/echo sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__20_eval.sh
/bin/echo sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__15_eval.sh
/bin/echo sh /export/hierMultiStream_audSpec_direct/tempScripts/decoder__10_eval.sh
echo "Done"

如果“10”输出丢失,那么你真的遇到了 sh 的问题。否则(同样,非常确定),问题出在您正在执行的 tempScripts 上。

【讨论】:

  • 我尝试减少 decoder__ 脚本的数量以检查是否是资源问题,但即使减少了脚本数量,最后一个脚本也总是无法执行。示例decoder__ 脚本如下:cd /export/Experiments/hierMultiStream_audSpec_direct/decoder__10sh decoder.sh eval > /export/Experiments /hierMultiStream_audSpec_direct/tempScripts/n_10.out 怀疑是否是decoder__ 脚本的问题,正如我之前在更改脚本顺序时指出的那样,它们运行良好,除了当前的最后一个脚本。
  • 在命令开头使用 /bin/echo 运行时,它会打印所有解码器脚本,包括最后一个。
  • @Vijay 如果解码器脚本没有问题,您应该能够使用我建议的 shFile 重现问题。你能?另外,为什么你一开始会有这么多嵌套的 shell 脚本呢?直接从python调用decoder.sh不是更容易,而不是调用一个调用另一个临时shellscript的shell脚本,它调用另一个 shellscript?
  • @Vijay /bin/echo 实验证明 Python 没有错。正如我所说,尝试减少由大量嵌套 shell 脚本引入的不必要的复杂性。如果这不起作用,请询问您详细说明最后一个脚本如何执行失败的问题(例如,如果您将echo "$@" >> /dev/shm/log 添加到它的顶部,是否写了什么?)
  • 嵌套脚本是必需的,因为原始脚本会产生数千行输出,这可能会导致 subprocess.communicate 出现死锁问题。但是我能够找出问题所在,在编写最后一个 decoder__ 脚本后我未能关闭文件。因此,子进程试图在脚本完全编写之前运行它。感谢您的帮助。
猜你喜欢
  • 2014-01-15
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
相关资源
最近更新 更多