How to set environment variables in Python?

前端 未结 11 1750
情话喂你
情话喂你 2020-11-22 04:00

I need to set some environment variables in the Python script and I want all the other scripts that are called from Python to see the environment variables\' set.

If

相关标签:
11条回答
  • 2020-11-22 04:16

    I have been trying to add environment variables. My goal was to store some user information to system variables such that I can use those variables for future solutions, as an alternative to config files. However, the method described in the code below did not help me at all.

    import os
    os.environ["variable_1"] = "value_1"
    os.environ["variable_2"] = "value_2"
    # To Verify above code
    os.environ.get("variable_1")
    os.environ.get("variable_2")
    

    This simple code block works well, however, these variables exist inside the respective processes such that you will not find them in the environment variables tab of windows system settings. Pretty much above code did not serve my purpose. This problem is discussed here: variable save problem

    os.environ.putenv(key, value)
    

    Another unsuccessful attempt. So, finally, I managed to save variable successfully inside the window environment register by mimicking the windows shell commands wrapped inside the system class of os package. The following code describes this successful attempt.

    os.system("SETX {0} {1} /M".format(key, value))
    

    I hope this will be helpful for some of you.

    0 讨论(0)
  • 2020-11-22 04:17

    You may need to consider some further aspects for code robustness;

    when you're storing an integer-valued variable as an environment variable, try

    os.environ['DEBUSSY'] = str(myintvariable)
    

    then for retrieval, consider that to avoid errors, you should try

    os.environ.get('DEBUSSY', 'Not Set')
    

    possibly substitute '-1' for 'Not Set'

    so, to put that all together

    myintvariable = 1
    os.environ['DEBUSSY'] = str(myintvariable)
    strauss = int(os.environ.get('STRAUSS', '-1'))
    # NB KeyError <=> strauss = os.environ['STRAUSS']
    debussy = int(os.environ.get('DEBUSSY', '-1'))
    
    print "%s %u, %s %u" % ('Strauss', strauss, 'Debussy', debussy)
    
    0 讨论(0)
  • 2020-11-22 04:18

    You can use the os.environ dictionary to access your environment variables.

    Now, a problem I had is that if I tried to use os.system to run a batch file that sets your environment variables (using the SET command in a **.bat* file) it would not really set them for your python environment (but for the child process that is created with the os.system function). To actually get the variables set in the python environment, I use this script:

    import re
    import system
    import os
    
    def setEnvBat(batFilePath, verbose = False):
        SetEnvPattern = re.compile("set (\w+)(?:=)(.*)$", re.MULTILINE)
        SetEnvFile = open(batFilePath, "r")
        SetEnvText = SetEnvFile.read()
        SetEnvMatchList = re.findall(SetEnvPattern, SetEnvText)
    
        for SetEnvMatch in SetEnvMatchList:
            VarName=SetEnvMatch[0]
            VarValue=SetEnvMatch[1]
            if verbose:
                print "%s=%s"%(VarName,VarValue)
            os.environ[VarName]=VarValue
    
    0 讨论(0)
  • 2020-11-22 04:27

    It should be noted that if you try to set the environment variable to a bash evaluation it won't store what you expect. Example:

    from os import environ
    
    environ["JAVA_HOME"] = "$(/usr/libexec/java_home)"
    

    This won't evaluate it like it does in a shell, so instead of getting /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home as a path you will get the literal expression $(/usr/libexec/java_home).

    Make sure to evaluate it before setting the environment variable, like so:

    from os import environ
    from subprocess import Popen, PIPE
    
    bash_variable = "$(/usr/libexec/java_home)"
    capture = Popen(f"echo {bash_variable}", stdout=PIPE, shell=True)
    std_out, std_err = capture.communicate()
    return_code = capture.returncode
    
    if return_code == 0:
        evaluated_env = std_out.decode().strip()
        environ["JAVA_HOME"] = evaluated_env
    else:
        print(f"Error: Unable to find environment variable {bash_variable}")
    
    0 讨论(0)
  • 2020-11-22 04:30

    if i do os.environ["DEBUSSY"] = 1, it complains saying that 1 has to be string.

    Then do

    os.environ["DEBUSSY"] = "1"
    

    I also want to know how to read the environment variables in python(in the later part of the script) once i set it.

    Just use os.environ["DEBUSSY"], as in

    some_value = os.environ["DEBUSSY"]
    
    0 讨论(0)
  • 2020-11-22 04:33

    Environment variables must be strings, so use

    os.environ["DEBUSSY"] = "1"
    

    to set the variable DEBUSSY to the string 1.

    To access this variable later, simply use:

    print(os.environ["DEBUSSY"])
    

    Child processes automatically inherit the environment variables of the parent process -- no special action on your part is required.

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