在python中复制shell环境以执行bash命令

在python中复制shell环境以执行bash命令,python,linux,bash,shell,Python,Linux,Bash,Shell,我正在尝试使用子流程模块从python内部执行bash脚本。问题是这个bash脚本依赖于在我的.bashrc文件中设置的许多环境变量。我希望python子流程能够准确地复制启动终端窗口时设置的环境。到目前为止,我试过: p = subprocess.Popen(args=['my-script.sh', '--additional_args'], stdout=subprocess.PIPE, env=os.environ.copy(), shell=True) output_buffer, r

我正在尝试使用
子流程
模块从python内部执行bash脚本。问题是这个bash脚本依赖于在我的
.bashrc
文件中设置的许多环境变量。我希望python子流程能够准确地复制启动终端窗口时设置的环境。到目前为止,我试过:

p = subprocess.Popen(args=['my-script.sh', '--additional_args'], stdout=subprocess.PIPE, env=os.environ.copy(), shell=True)
output_buffer, return_code = p.communicate()
但是在某个地方读到,即使执行了
shell=True
,仍然没有加载
.bashrc
文件,我应该尝试以下操作:

p = subprocess.Popen(args=['/bin/bash', '-i', '-c', 'my_script.sh', '--additional_args'], stdout=subprocess.PIPE)
output_buffer, return_code = p.communicate()
但是通过这个函数调用,我得到了以下错误:

tput: No value for $TERM and no -T specified
bash: cannot set terminal process group (2071): Inappropriate ioctl for device
bash: no job control in this shell
这对我很有用:

Bashrc

$ cat ~/.bashrc  |grep LOLO
export LOLO="/foo/bar"
Bash

#!/usr/bin/bash

echo $LOLO
Python

#!/usr/bin/python

import subprocess, os
my_env = os.environ.copy()
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen('/home/m.ortiz.montealegre/lolo/script.sh', env=my_env)
输出:

$ python script.py
/foo/bar
问题是,如果向bashrc添加新值(别名/变量),则需要重新启动终端,以便执行bashrc并使这些更改在环境中可用

我已经找到了做这件事的参考资料

注意:在子shell进程中,不能将环境变量设置为父shell。

可能有用