如何在python中设置环境变量

How to set environment variables in Python

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

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


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

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

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

1
print os.environ["DEBUSSY"]

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


您可能需要考虑一些代码健壮性的进一步方面;

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

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

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

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

可能将"-1"替换为"未设置"

所以,把这些放在一起

1
2
3
4
5
6
7
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)


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

Python 2

1
2
3
4
5
6
7
8
9
10
>>> 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_键

1
2
3
4
>>> import os
>>> 'HOME' in os.environ  # Check an existing env. variable
True
...

使用os.environ有一个重要注意事项:

虽然子进程从父进程继承环境,但我最近遇到了一个问题,并发现如果在运行python脚本时有其他脚本在更新环境,那么再次调用os.environ将不会反映最新的值。

文件摘录:

This mapping is captured the first time the os module is imported,
typically during Python startup as part of processing site.py. Changes
to the environment made after this time are not reflected in
os.environ, except for changes made by modifying os.environ directly.

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

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


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

然后做

1
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.

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

1
some_value = os.environ["DEBUSSY"]

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

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

如果要读取或打印环境变量,只需使用

print os.environ["DEBUSSY"]

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

enter image description here


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


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

现在,我遇到的一个问题是,如果我试图使用os.system来运行一个设置环境变量的批处理文件(在一个**.bat*文件中使用set命令),它不会真正为您的Python环境设置这些变量(而是为使用os.system函数创建的子进程)。要在python环境中实际获取变量集,我使用以下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

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

您可能需要像这个问题中描述的modified_environ上下文管理器这样的东西来恢复环境变量。

经典用法:

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

要设置变量:

使用键的项分配方法:

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

获取或检查它是否存在,

因为os.environ是一个实例,所以可以尝试对象方式。

方法1:

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

将得到'1'作为返回值

方法2:

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

方法3:

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

方法4:

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