2017-06-07 55 views
2

我正在尝试使用subprocess模块从python内部执行bash脚本。问题是这个bash脚本依赖于我的.bashrc文件中设置的许多环境变量。我想要的是python子进程完全复制我启动终端窗口时设置的环境。到目前为止,我尝试:在python中复制shell环境以执行bash命令

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 
+1

可能会有用https://stackoverflow.com/questions/9673730/interacting-with-bash-from-python – taras

回答

1

这为我工作:

的.bashrc

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

#!/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得到执行并使这些更改在环境中可用。

我已经找到了引用做到这一点herehere

注:从你不能设置环境变量来父shell子shell进程。