在python中寻找bash文件并在同一脚本中使用环境变量
如何在python脚本中获取bash文件的源代码,并在python中使用环境变量(在bash脚本中设置)?当我从python脚本中删除源文件并在根目录(bash脚本中的一个环境变量)之外寻找它时,我的python脚本能够识别它。您能建议我如何实现bash脚本的资源化并使用python脚本中的变量吗。下面我举了一个例子在python中寻找bash文件并在同一脚本中使用环境变量,python,python-3.x,bash,scripting,os.system,Python,Python 3.x,Bash,Scripting,Os.system,如何在python脚本中获取bash文件的源代码,并在python中使用环境变量(在bash脚本中设置)?当我从python脚本中删除源文件并在根目录(bash脚本中的一个环境变量)之外寻找它时,我的python脚本能够识别它。您能建议我如何实现bash脚本的资源化并使用python脚本中的变量吗。下面我举了一个例子 #!/usr/bin/python3 import sys, getopt import os def main(argv): os.system('source ./
#!/usr/bin/python3
import sys, getopt
import os
def main(argv):
os.system('source ./init.sh')
root_dir = os.environ['ROOT_DIR']
if __name__ == "__main__":
main(sys.argv[1:])
我得到的错误如下:
采购成功完成。。。回溯(最近一次呼叫最后一次):文件“test.py”,第213行,在 main(sys.argv[1:])文件“test.py”,第33行,在main中 root\u dir=os.environ['root\u dir']文件/usr/lib64/python3.6/os.py”,第669行,在getitem 从None KeyError引发KeyError(键):“根目录” 我的bash脚本如下所示:
export ROOT_DIR=${PWD}
export TB_DIR=${PWD}/..
它不会那样工作的 shell脚本在子进程中运行,子进程获取父进程环境表的自身副本 您需要在shell脚本的末尾添加例如
printenv
,然后使用例如抓取printenv
输出,然后解析它并将所需的环境变量复制回Python进程的environ
或者,最好使用机器可读的声明性格式来开始配置,而不是使用任意程序:)
例子
假设shell.sh
是要运行的脚本,它声明export foooo=bar
:
output = subprocess.check_output("./shell.sh", shell=True)
# Parse the `printenv` output
exported_vars = dict(
line.split("=", 1)
for line in output.decode().splitlines()
if line
)
# Filter to keep only variables that have new or changed values
changed_vars = {
key: value
for (key, value) in exported_vars.items()
if value != os.environ.get(key)
}
pprint.pprint(changed_vars)
repl.it中的输出为
{'COLUMNS': '93',
'FOOFOO': 'bar',
'LINES': '64',
'SHLVL': '1',
'_': '/usr/bin/printenv'}
@hw编码器,
source
仅在shell中工作,因为它在该shell进程中运行命令。它给人的印象是它会影响父进程,但事实并非如此。这就像一个eval
。我在bash脚本的末尾添加了printenv,并在python脚本中添加了子进程。但仍然无法获取ROOT_DIR环境变量。由于我是python新手,您能给我举个例子吗?这将非常有帮助。在您的回答“o获取printenv输出,然后解析它并将所需的环境变量复制回Python进程的环境”中,我不知道该怎么做。您是否查看了check_output
的返回值?