我正在尝试使用
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
这对我有用:
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 并使这些更改在环境中可用。
找到了执行此操作的参考资料注意: 从子 shell 进程中,您无法将环境变量设置到父 shell。
xonsh shell 对于 bash 和 python 的混合应该很有用
xonsh 是一个基于 Python 的 shell,它结合了 Python 的灵活性和 shell 环境的便利性。它支持交互式使用、>脚本编写以及与现有Python库和工具的无缝集成。