如何在Python中设置环境变量

时间:2011-05-11 22:25:11

标签: python environment-variables

我需要在python脚本中设置一些环境变量,我希望从python(shell脚本)调用的所有其他脚本都是子进程来查看环境变量集。该值是一个数字。

如果我os.environ["DEBUSSY"] = 1,则抱怨说1必须是字符串。 我也想知道在设置之后如何在python中读取环境变量(在脚本的后面部分)。

14 个答案:

答案 0 :(得分:575)

环境变量必须是字符串,因此请使用

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

将变量DEBUSSY设置为字符串1。要稍后访问此变量,只需使用

print os.environ["DEBUSSY"]

子进程自动继承父进程的环境 - 您无需执行任何特殊操作。

答案 1 :(得分:95)

您可能需要考虑代码健壮性的其他方面;

当您将整数值变量存储为环境变量时,请尝试

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

然后进行检索,考虑到为了避免错误,你应该尝试

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

可能用'-1'代替'未设置'

所以,把它们放在一起

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)

答案 2 :(得分:41)

os.environ的行为类似于python字典,因此可以执行所有常见的字典操作。除了其他答案中提到的getset操作之外,我们还可以简单地检查密钥是否存在

Python 2

>>> import os
>>> os.environ.has_key('HOME')  # Check an existing env. variable
True
>>> os.environ.has_key('FOO')   # Check for a non existing variable
False
>>> os.environ['FOO'] = '1'     # Set a new env. variable (String value)
>>> os.environ.has_key('FOO')
True
>>> os.environ.get('FOO')       # Retrieve the value
'1'

Python 3

对于python 3,词典使用 in 关键字而不是 has_key

>>> import os
>>> 'HOME' in os.environ  # Check an existing env. variable
True
...

使用os.environ时需要注意一件重要事项:

尽管子进程从父进程继承了环境,但我最近遇到了一个问题并且想通了,如果在python脚本运行时有其他脚本更新环境,请再次调用os.environ 不会反映最新值

摘自docs

  

第一次导入os模块时捕获此映射,   通常在Python启动期间作为处理site.py的一部分。变化   在此时间之后制造的环境没有反映出来   os.environ,除了直接修改os.environ所做的更改。

存储所有环境变量的

os.environ.data是一个dict对象,它包含所有环境值:

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>

答案 3 :(得分:18)

  

如果我做os.environ [“DEBUSSY”] = 1,它   抱怨说1必须是   字符串。

然后做

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

我也想知道如何阅读   python中的环境变量(在   一旦我设定,脚本的后面部分)   它

只需使用os.environ["DEBUSSY"],就像

一样
some_value = os.environ["DEBUSSY"]

答案 4 :(得分:17)

您应该将字符串值分配给环境变量。

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

如果您想阅读或打印环境变量,请使用

print os.environ["DEBUSSY"]

此更改仅对分配给它的当前进程有效,不会永久更改该值。子进程将自动继承父进程的环境。

enter image description here

答案 5 :(得分:14)

os.environ["DEBUSSY"] = '1'怎么样?环境变量总是字符串。

答案 6 :(得分:10)

您可以使用os.environ字典访问您的环境变量。

现在,我遇到的一个问题是,如果我尝试使用os.system运行一个设置环境变量的批处理文件(使用**。bat *文件中的SET命令),它就不会真正设置它们适用于您的python环境(但是对于使用os.system函数创建的子进程)。要实际获取python环境中设置的变量,我使用以下脚本:

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

答案 7 :(得分:7)

当您使用环境变量(添加/修改/删除变量)时,一个好的做法是在功能完成时恢复先前的状态。

您可能需要此question中描述的modified_environ上下文管理器等内容来恢复环境变量。

经典用法:

with modified_environ(DEBUSSY="1"):
    call_my_function()

答案 8 :(得分:6)

设置变量:

使用键的项目分配方法:

import os    
os.environ['DEBUSSY'] = '1'  #Environ Variable must be string not Int

获取或检查其是否存在,

因为 os.environ 是可以尝试对象方式的实例。

方法1:

os.environ.get('DEBUSSY') # this is error free method if not will return None by default

将获得'1'作为返回值

方法2:

os.environ['DEBUSSY'] # will throw an key error if not found!

方法3:

'DEBUSSY' in os.environ  # will return Boolean True/False

方法4:

os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements

答案 9 :(得分:4)

如果环境中不存在变量,则使用 setdefault 函数设置新变量。

确保将环境变量设置为字符串,而不是整数。否则会抛出 TypeError

import os

if not os.environ.get("DEBUSSY"):
    os.environ.setdefault("DEBUSSY","1")
else:
     os.environ["DEBUSSY"] = "1"

print(os.environ["DEBUSSY"])

答案 10 :(得分:2)

有一个很好的开箱即用的 Python 解决方案,称为 pycrosskit。 它将创建对 Linux 和 Windows 都具有持久性的环境变量。

用法:

# Will Set Persistent Value for Variable in System
# * subkey works only for windows like file in folder
# * reg_path works only for windows as register path 
SysEnv.set_var(name, value, subkey, reg_path=default_reg_path)

# Will Get Persistent Value for Variable in System
# * reg_path works only for windows as register path
# * delete, deletes key from environment and its subkeys after read
SysEnv.get_var(name, reg_path=default_reg_path, delete=False)

答案 11 :(得分:0)

应注意,如果您尝试将环境变量设置为bash评估,则它不会存储您的期望。示例:

from os import environ

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

这不会像在shell中那样对它求值,因此,不用获取/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home作为路径,而是得到文字表达式$(/usr/libexec/java_home)

确保在设置环境变量之前对其进行评估,如下所示:

from os import environ
from subprocess import Popen, PIPE

bash_variable = "$(/usr/libexec/java_home)"
capture = Popen("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("Error: Unable to find environment variable " + bash_variable)

答案 12 :(得分:0)

我一直在尝试添加环境变量。我的目标是将一些用户信息存储到系统变量中,以便可以将这些变量用于将来的解决方案,以替代配置文件。 但是,下面代码中描述的方法完全没有帮助我。

    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")

此简单的代码块运行良好,但是,这些变量存在于各自的进程中,因此您将无法在Windows系统设置的环境变量选项卡中找到它们。上面的代码几乎没有达到我的目的。这里讨论这个问题。 variable save problem

    os.environ.putenv(key, value)

另一次失败的尝试。因此,最后,我通过模仿包装在os包系统类中的Windows shell命令,成功地将变量保存在窗口环境寄存器中。以下代码描述了此成功尝试。

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

希望对您中的某些人有帮助。

答案 13 :(得分:0)

如果你在 Flask 和 unittest 上苦苦挣扎,请记住,如果你在任何方法之外设置了一个变量,这个变量会在你导入应用程序时被读取。可能看起来微不足道,但可以为某人省去一些麻烦。

例如,如果进入你的 Flask 单元测试你:

  1. 导入应用
  2. setUp 方法中设置环境变量。
  3. 使用 app.test_client() 测试您的应用

进入第二步的变量不会被第三步看到,因为执行第一步时变量已经被读取了。