我非常是 python 的新手,所以我欢迎有关更多惯用方法的建议,但以下代码使用 bash 本身来告诉我们通过首先调用 bash 来设置哪些值空环境 (env -i bash) 告诉我们将哪些变量设置为基线,然后我再次调用它并告诉 bash 获取您的“变量”文件,然后告诉我们现在设置了哪些变量.在删除了一些误报和一个明显的空白行之后,我循环通过“附加”输出,寻找不在基线中的变量。新出现的变量会被拆分(小心地)并放入bash 字典中。我已经离开这里(但被注释掉了)我之前使用 exec 在 python 中本地设置变量的想法,但我遇到了引用/转义问题,所以我转而使用 dict。
如果对“变量”文件的确切调用(路径等)与我的不同,那么您需要更改该值的所有实例——在subprocess.check_output() 调用中,在@987654327 中@ 调用。
这是我使用的示例变量文件,只是为了演示一些可能发生的事情:
foo_1="var1"
foo_2="var2"
foo_3="var3"
if [[ -z $foo_3 ]]; then
foo_4="test"
else
foo_4="testing"
fi
foo_5="O'Neil"
foo_6='I love" quotes'
foo_7="embedded
newline"
...这是python脚本:
#!/usr/bin/env python
import subprocess
output = subprocess.check_output(['env', '-i', 'bash', '-c', 'set'])
baseline = output.split("\n")
output = subprocess.check_output(['env', '-i', 'bash', '-c', '. myGlobalVariables.bash; set'])
additional = output.split("\n")
# these get set when ". myGlobal..." runs and so are false positives
additional.remove("BASH_EXECUTION_STRING='. myGlobalVariables.bash; set'")
additional.remove('PIPESTATUS=([0]="0")')
additional.remove('_=myGlobalVariables.bash')
# I get an empty item at the end (blank line from subprocess?)
additional.remove('')
bash = {}
for assign in additional:
if not assign in baseline:
name, value = assign.split("=", 1)
bash[name]=value
#exec(name + '="' + value + '"')
print "New values:"
for key in bash:
print "Key: ", key, " = ", bash[key]
另一种方法:
受Marat 的回答启发,我想出了这个两阶段的技巧。从一个 python 程序开始,我们称之为“stage 1”,它使用subprocess 调用 bash 来获取变量文件,就像我上面的答案一样,但是它告诉 bash 导出所有变量,然后执行你的python程序的其余部分,处于“阶段2”。
第一阶段python程序:
#!/usr/bin/env python
import subprocess
status = subprocess.call(
['bash', '-c',
'. myGlobalVariables.bash; export $(compgen -v); exec ./stage2.py'
]);
第二阶段python程序:
#!/usr/bin/env python
# anything you want! for example,
import os
for key in os.environ:
print key, " = ", os.environ[key]