我想通过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')
答案 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也不例外。