2

我在使用多个子进程调用时遇到问题。

这两个工作正常:

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")

我在那里添加了睡眠,因为我需要几秒钟才能运行“./go2.sh”程序。不确定这是否是问题所在。

有什么建议吗?

4

1 回答 1

2

您的 shell 脚本在命令行上运行的一个可能原因是 shebang 行没有正确编写(或根本没有编写)。查看脚本可以从命令行运行但不能作为 Python 子进程运行的示例:这是在 Python 中运行 shell 脚本的正确方法吗?

如果您的 shell 脚本没有指定 shebang 行,它可以从命令行运行,因为在您的环境中设置了 $SHELL 并且脚本将其作为默认设置。从 python 子进程运行时,python 不知道它是什么并且失败并显示OSError: [Errno 8] Exec format error. 之所以subprocess.call()起作用gmake,是因为它是二进制程序而不是 shell 脚本。使用参数shell=True给出了一个指令,可以像在 shell 中一样解释参数。

shell=True但是,使用in时要小心,subprocess.call()因为在某些情况下它可能不安全:subprocess Python docs

于 2012-07-26T23:25:45.520 回答