I believe that running an external command with a slightly modified environment is a very common case. That's how I tend to do it:
import subprocess, os
my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
I've got a gut feeling that there's a better way; does it look alright?
I know this has been answered for some time, but there are some points that some may want to know about using PYTHONPATH instead of PATH in their environment variable. I have outlined an explanation of running python scripts with cronjobs that deals with the modified environment in a different way (found here). Thought it would be of some good for those who, like me, needed just a bit more than this answer provided.
With Python 3.5 you could do it this way:
Here we end up with a copy of
os.environ
and overriddenPATH
value.It was made possible by PEP 448 (Additional Unpacking Generalizations).
Another example. If you have a default environment (i.e.
os.environ
), and a dict you want to override defaults with, you can express it like this:The env parameter accepts a dictionary. You can simply take os.environ, add a key (your desired variable) (to a copy of the dict if you must) to that and use it as a parameter to
Popen
.I think
os.environ.copy()
is better if you don't intend to modify the os.environ for the current process:you might use
my_env.get("PATH", '')
instead ofmy_env["PATH"]
in casePATH
somehow not defined in the original environment, but other than that it looks fine.To temporarily set an environment variable without having to copy the os.envrion object etc, I do this: