我正在尝试编写一个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分钟)如果构建成功与否,它也不会给你我需要知道的返回值。
有谁知道更好的方法吗?
答案 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编写的构建和/或测试框架。我不会推荐任何特定的框架,因为我没有那么多经验。)