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

标签 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

最佳答案

这对我有用:

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 并使这些更改在环境中可用。

我找到了执行此操作的引用资料 herehere

注意:您不能从子 shell 进程将环境变量设置到父 shell。

关于python - 在 python 中复制 shell 环境以执行 bash 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44418922/

相关文章:

linux - WebSphere MQ v7 对 Redhat Linux 的绑定(bind)支持

php - 模式的终止命令

java - 创建数组列表

python - AWS Lambda 函数无法扩展 - 为什么以及有哪些选项?

python - 如何解决 Python 3.6 中的 UnicodeDecodeError?

c++ - 作弊 Linux : executables and dependent libraries via LD_PRELOAD

ruby - 从 FaSTLane 将环境变量传递给 shell 脚本

bash - sudo'd mysqldump over ssh 语法?

linux shell 获取文件名

Python - 如何将今天在文件夹中创建的文件上传到 S3