I want to set an environmental variable in linux terminal through a python script. I seem to be able to set environmental variables when using os.environ['BLASTDB'] = '/path/to/directory'
.
However I was initially trying to set this variable with subprocess.Popen
with no success.
import subprocess
import shlexcmd1 = 'export BLASTDB=/path/to/directory'
args = shlex.split(cmd1)
p = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()
Why does subprocess.Popen
fail to set the environmental variable BLASTDB to '/path/to/directory'?
NOTE:
This also fails when using:
import os
os.system('export BLASTDB=/path/to/directory')
Use the env
parameter to set environment variables for a subprocess:
proc = subprocess.Popen(args, stdout=subprocess.PIPE,env={'BLASTDB': '/path/to/directory'})
Per the docs:
If env is not None, it must be a mapping that defines the environmentvariables for the new process; these are used instead of inheritingthe current process’ environment, which is the default behavior.
Note: If specified, env must provide any variables required for the programto execute. On Windows, in order to run a side-by-side assembly thespecified env must include a valid SystemRoot.
os.environ
can used for accessing current environment variables of the python process. If your system also supports putenv, then os.environ
can also be used for setting environment variables (and thus could be used instead of Popen's env
parameter shown above). However, for some OSes such as FreeBSD and MacOS, setting os.environ
may cause memory leaks, so setting os.environ
is not a robust solution.
os.system('export BLASTDB=/path/to/directory')
runs a subprocess which sets the BLASTDB
environment variable only for that subprocess. Since that subprocess ends, it has no effect on subsequent subprocess.Popen
calls.