Python脚本,它运行多个shell命令并等待结果

时间:2015-11-05 20:25:16

标签: python linux shell

我正在尝试编写一个python包装器来构建一些软件。我需要使用不同的配置自动构建数百次,这意味着我不能只<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key><true/> <key>NSExceptionDomains</key> <dict> <key>facebook.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> <key>fbcdn.net</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> <key>akamaihd.net</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> </dict> </dict> 。我使用的一些配置需要运行一个有条件地设置一些环境变量的脚本。我想要的是能够做这样的事情:

autogen.sh ; ./configure ; make ; make install

我遇到的问题是command = './autogen.sh' ret = subprocess.call(command.split()) if ret != 0: sys.exit(ret) command = './script.sh ; ./configure <configure-flags>' ret = subprocess.call(command.split()) if ret != 0: sys.exit(ret) command = 'make' ret = subprocess.call(command.split()) if ret != 0: sys.exit(ret) command = 'make install' ret = subprocess.call(command.split()) if ret != 0): sys.exit(ret) 中未设置script.sh中设置的环境变量。我在Sending multiple commands to a bash shell which must share an environment中看到了一个部分解决方案,但这涉及将命令刷新到configure并轮询一个结果,当你有一个非常长的makefile时,这个结果将无法正常工作(我需要大约10到20分钟)如果构建成功与否,它也不会给你我需要知道的返回值。

有谁知道更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您的脚本设置了以后要访问的变量,则必须使用它(类似于其他语言称为“include”)。

而不是

command = './script.sh ; ./configure <configure-flags>'
ret = subprocess.call(command.split())

你可以做到

command = ["bash", "-c", "source script.sh; ./configure"]
subprocess.call(command)

答案 1 :(得分:0)

这里的基本问题是环境变量只被复制&#34;向下&#34; (从父母到孩子),从不&#34;向上&#34; (孩子对父母)。你的python脚本是父。它运行一个shell命令,因此它是一个孩子; shell运行更多的命令,这些命令是shell的子代(因此也是Python进程的孙子)。

要使环境变量持续存在,您需要以某种方式向上导入它们。具体如何取决于你。一种常见的技术(在shell脚本和Python中使用)是让导出器打印它想要设置的值,然后让shell或Python进程读取该输出并进行设置。 (我看到你链接的帖子是什么。)

例如,子进程可能会打印:

CONFIG_PATH=/path/to/config/file

(或添加export时相同)然后外壳只是eval这个。这意味着非常信任:例如,如果子进程打印rm -rf /怎么办?可以在执行之前将规则(例如正则表达式匹配)应用于输出,甚至可以手动(或自动)解析它,但在验证步骤之后才执行结果。

另一种方法是将配置写入文件,并让父级读取文件。这几乎是相同的技术,但使用通信库的文件,而不是摆弄stdin和stdout。它还有几个问题(命名文件,知道何时阅读)。

(当然,有许多用Python编写的构建和/或测​​试框架。我不会推荐任何特定的框架,因为我没有那么多经验。)

相关问题