使用 Popen 在 Python 中设置环境变量

Hel*_*ors 5 python subprocess environment-variables

我想通过python脚本在linux终端中设置一个环境变量。我似乎可以在使用os.environ['BLASTDB'] = '/path/to/directory'.

但是,我最初尝试设置此变量但subprocess.Popen没有成功。

import subprocess
import shlex

cmd1 = 'export BLASTDB=/path/to/directory'
args = shlex.split(cmd1)
p = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()
Run Code Online (Sandbox Code Playgroud)

为什么subprocess.Popen无法将环境变量BLASTDB设置为'/path/to/directory'?

注意:这在使用时也会失败:

import os
os.system('export BLASTDB=/path/to/directory')
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 7

使用该env参数为子进程设置环境变量:

proc = subprocess.Popen(args, stdout=subprocess.PIPE,
                        env={'BLASTDB': '/path/to/directory'})
Run Code Online (Sandbox Code Playgroud)

根据文档

如果 env 不是 None,则它必须是定义新进程的环境变量的映射;使用这些而不是继承当前进程的环境,这是默认行为。

注意:如果指定,env 必须提供程序执行所需的任何变量。在 Windows 上,为了运行并行程序集,指定的 env 必须包含有效的 SystemRoot。


os.environ可用于访问python进程的当前环境变量。如果您的系统也支持putenv,那么os.environ也可以用于设置环境变量(因此可以用来代替env上面显示的 Popen 的参数)。但是,对于 FreeBSD 和 MacOS 等一些操作系统,设置os.environ 可能会导致内存泄漏,因此设置os.environ不是一个健壮的解决方案。


os.system('export BLASTDB=/path/to/directory')运行一个子进程,BLASTDB该子进程仅为该子进程设置环境变量。由于该子流程结束,因此对后续subprocess.Popen调用没有影响。