在python中寻找bash文件并在同一脚本中使用环境变量

在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 ./

如何在python脚本中获取bash文件的源代码,并在python中使用环境变量(在bash脚本中设置)?当我从python脚本中删除源文件并在根目录(bash脚本中的一个环境变量)之外寻找它时,我的python脚本能够识别它。您能建议我如何实现bash脚本的资源化并使用python脚本中的变量吗。下面我举了一个例子

#!/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
的返回值?