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

时间:2014-06-19 17:27:30

标签: python environment-variables subprocess

我想通过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()

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

注意: 使用时也会失败:

import os
os.system('export BLASTDB=/path/to/directory')

2 个答案:

答案 0 :(得分:3)

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

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

the docs

  

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

     

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


os.environ可用于访问 python进程的当前环境变量。如果您的系统也支持putenv,那么os.environ也可以用于设置环境变量(因此可以用来代替上面显示的Popen的env参数) 。但是,对于某些操作系统(如FreeBSD和MacOS),请设置os.environ may cause memory leaks,因此设置os.environ不是一个强大的解决方案。


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

答案 1 :(得分:0)

据我所知,你无法真正修改执行过程'来自子进程或子shell的环境,无论是Python还是bash本身。环境变量特定于您所使用的特定进程(至少在Unix上,您似乎正在使用它)。

生成的任何子进程通常都会继承该环境,但只能继承该环境的副本。例如,如果从终端会话中运行bash并导出新的环境变量,则退出该子shell后,原始shell将不受影响。运行Python也不例外。