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

时间:2017-06-07 17:12:04

标签: python linux bash shell

我正在尝试使用subprocess模块从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

1 个答案:

答案 0 :(得分: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。