我在连续使用多个子进程调用时遇到问题。
这两个工作正常:
subprocess.call(["gmake", "boot-tilera"], cwd="/home/ecorbett/trn_fp")
p = subprocess.Popen(["gmake", "run-tilera"], stdout=subprocess.PIPE, cwd="/home/ecorbett/trn_fp")
但是,当我尝试在以下位置直接运行此调用时出现错误:
time.sleep(10)
subprocess.call(["./go2.sh"], cwd="/home/ecorbett/trn_fp/kem_ut")
我在那里添加了 sleep ,因为在运行“./go2.sh”程序之前我需要几秒钟。不确定这是否是问题所在。
有什么建议吗?
最佳答案
您的 shell 脚本在命令行上运行的一个可能原因是 shebang 行编写不正确(或根本没有编写)。请参阅一个示例,其中脚本可以从命令行运行,但不能作为 Python 子进程运行: Is this the right way to run a shell script inside Python?
如果您的 shell 脚本没有指定 shebang 行,它将在命令行中工作,因为 $SHELL 是在您的环境中设置的,并且脚本将其作为默认值。当从 python 子进程运行时,python 不知道它是什么,并且失败并显示 OSError: [Errno 8] Exec format error
。 gmake
的 subprocess.call()
之所以有效,是因为它是一个二进制程序,而不是 shell 脚本。使用参数 shell=True
给出了一条指令来解释该参数,就像在 shell 中一样。
但是,在 subprocess.call()
中使用 shell=True
时要小心,因为在某些情况下它可能不安全:subprocess Python docs .
关于python - 无法使用子进程进行连续调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11677825/