Python subprocess/Popen with a modified environment

前端 未结 8 660
再見小時候
再見小時候 2020-11-22 14:06

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_         


        
相关标签:
8条回答
  • 2020-11-22 14:30

    I think os.environ.copy() is better if you don't intend to modify the os.environ for the current process:

    import subprocess, os
    my_env = os.environ.copy()
    my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
    subprocess.Popen(my_command, env=my_env)
    
    0 讨论(0)
  • 2020-11-22 14:30

    In certain circumstances you may want to only pass down the environment variables your subprocess needs, but I think you've got the right idea in general (that's how I do it too).

    0 讨论(0)
  • 2020-11-22 14:32

    With Python 3.5 you could do it this way:

    import os
    import subprocess
    
    my_env = {**os.environ, 'PATH': '/usr/sbin:/sbin:' + os.environ['PATH']}
    
    subprocess.Popen(my_command, env=my_env)
    

    Here we end up with a copy of os.environ and overridden PATH 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:

    my_env = {**os.environ, **dict_with_env_variables}
    
    0 讨论(0)
  • 2020-11-22 14:37

    you might use my_env.get("PATH", '') instead of my_env["PATH"] in case PATH somehow not defined in the original environment, but other than that it looks fine.

    0 讨论(0)
  • 2020-11-22 14:40

    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.

    0 讨论(0)
  • 2020-11-22 14:47

    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.

    0 讨论(0)
提交回复
热议问题