Python 与父 shell 环境一起工作

标签 python linux shell

是否可以创建一个 shell 对象并在执行命令后不丢失其数据的情况下对其进行操作?

from subprocess import *
sh.Popen('/bin/bash', stdout=PIPE)
sh.communicate('source /path/to/file/env.sh')
print os.getenv('ENV_VAR1')

ENV_VAR1 应该在采购 /path/to/file/env.sh 之后可用,但事实并非如此。 这部分代码没有按预期工作,我该如何让它工作?

这是另一种尝试,但效果不佳

os.system('source env.sh; echo $ENV_VAR1') #Prints out correct value
os.system('echo $ENV_VAR1') #Prints nothing

最佳答案

您可以echo $ENV_VAR1,并使用communicate 从标准输出返回结果:

import subprocess
proc = subprocess.Popen('source /path/to/file/env.sh; echo $ENV_VAR1', 
                        stdout=PIPE, shell=True)
env_var1, err = proc.communicate()
print(env_var1)

另一种选择可能是使用 Miki Tebeka's source function :

import subprocess
import os

def source(script, update=True):
    """
    source a file and return the environment as a dict.
    http://pythonwise.blogspot.fr/2010/04/sourcing-shell-script.html (Miki Tebeka)
    """
    proc = subprocess.Popen("source %s; env -0" % script, stdout=subprocess.PIPE, 
                            shell=True)
    output, err = proc.communicate()
    env = dict((line.split("=", 1) for line in output.split('\x00') if line))
    if update:
        os.environ.update(env)
    return env

source('/path/to/env.sh')
print(os.environ['ENV_VAR1'])

如果/path/to/file/env.sh包含

ENV_VAR1=FOO
export ENV_VAR1

上面的脚本打印

FOO

以上,I made a small change到 使 env 使用空字节 (\x00) 来分隔输出的函数 线。这使得解析跨越多个的名称/值对成为可能 行。

关于Python 与父 shell 环境一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31514324/

相关文章:

python - 有多少第二个 Keep-Alive 在 Tornado 中停留?

python - 全新安装 Jupyter 导致 IR 内核崩溃

python - 如何将 awk 生成的列加载到 python 列表中

c++ - 为什么单纯的C++矩阵乘法比BLAS慢100倍?

linux - 打印有关文本文件的统​​计信息的 Bash 脚本

shell - 为什么 echo 函数在这里不打印任何东西?

python - 解决 Django 模型不同验证的设计模式

c++ - 在运行时使用 root 执行程序

linux - openWRT 中的 hostapd 使用上一个配置字段而不是新配置字段

linux - 仅保留唯一行,搜索整个目录