I am having an issue with setting an environment variable on a call to subprocess.Popen
. The environment variable does not seem to be getting set. Any suggestions on how to properly set environmental variables for a Python commandline call?
My goal is to run a script that uses an environmental variable determined from my Python code:
d = dict(os.environ)
d["TEST_VARIABLE"] = str(1234)
subprocess.Popen('/usr/bin/mybinary', env=d).wait()
but the script reacts as if the variable has never been set
Here is my attempt to test, using Python's interactive interpreter:
d = dict(os.environ)
d["TEST_VARIABLE"] = str(1234)
subprocess.Popen(['/bin/echo', '$TEST_VARIABLE'], env=d).wait()
and the output is:
"$TEST_VARIABLE"
0
I thought env=d
should set the environment for the subprocess, but it apparently does not. Any suggestions on how to correct this issue?
For Python 3.5 and newer, you can use unpacking generalizations, eg:
You should use
os.environ.copy()
to make it work. It creates a copy of the entire environment dictionary which you can then modify before passing it on to the subprocess, without modifying the current process environment.See this answer.
The substitution of environment variables on the command line is done by the shell, not by /bin/echo. So you need to run the command in a shell to get the substitution:
That doesn't mean the environment variable is not set when
shell=False
, however. Even withoutshell=True
, the executable does see the enviroment variables set by theenv
parameter. For example,date
is affected by theTZ
environment variable: