我需要在Python脚本中设置一些环境变量,并且我希望所有从Python调用的其他脚本都能看到设置的环境变量。
如果我这样做:
os.environ["DEBUSSY"] = 1
它报错,说1
必须是一个字符串。
我还想知道如何在Python中读取环境变量(在脚本的后半部分),一旦我设置了它。
我需要在Python脚本中设置一些环境变量,并且我希望所有从Python调用的其他脚本都能看到设置的环境变量。
如果我这样做:
os.environ["DEBUSSY"] = 1
它报错,说1
必须是一个字符串。
我还想知道如何在Python中读取环境变量(在脚本的后半部分),一旦我设置了它。
环境变量必须是字符串,因此请使用
import os
os.environ["DEBUSSY"] = "1"
将变量DEBUSSY
设置为字符串1
。
稍后要访问此变量,只需使用
print(os.environ["DEBUSSY"])
子进程会自动继承父进程的环境变量 -- 您无需采取特殊行动。
putenv()
,但对于这些Unix,你无能为力。我曾经使用过的旧版本AIX和HPUX也支持它。如果有人今天真的能找到一台不支持它的电脑,我严重怀疑他们是否能在那台电脑上运行Python. :) - Sven Marnach为了使代码更加健壮,您可能需要考虑一些其他方面;
当您将一个整型变量存储为环境变量时,请尝试
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)
myvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else None
,这样如果没有提供数字,则为None。 - Benjamin Atkinvalue_not_set ='-1'
)。然后,您可以使用debussy = int(os.environ.get('DEBUSSY', value_not_set))
。 - yeOldeDataSmytheos.environ
行为类似于Python字典,因此可以执行所有常见的字典操作。除了其他答案中提到的 get
和 set
操作之外,我们还可以简单地检查一个键是否存在。键和值应该存储为字符串。
Python 3
对于Python 3,字典使用in 关键字而不是 has_key。
>>> import os
>>> 'HOME' in os.environ # Check an existing env. variable
True
...
Python 2
: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'
注意使用os.environ
时有一件重要的事情:
虽然子进程会继承父进程的环境变量,但最近我遇到了一个问题并发现如果您的Python脚本正在运行时有其他脚本更新环境变量,则再次调用os.environ
将不会反映最新值。
来自文档的摘录:
此映射在第一次导入 os 模块时进行捕获,通常在处理 site.py 作为 Python 启动的一部分时进行。在此之后对环境所做的更改不会反映在 os.environ 中,除非通过直接修改 os.environ 所做的更改。
os.environ.data
存储所有环境变量,是一个包含所有环境值的 dict 对象:
>>> type(os.environ.data) # changed to _data since v3.2 (refer comment below)
<type 'dict'>
os.environ.data
被重命名为os.environ._data
,下划线前缀表示你不应该直接读取它。无论如何,os.environ._data
也不会具有更新后的值。 - Al Sweigartos.environ
的行为类似于Python字典,因此可以执行所有常见的字典操作。除了提到的获取和设置操作之外...”它没有.set()
方法,只有.setdefault()
方法。 - smci在使用此方法之前,请查看评论部分
我一直在尝试添加环境变量。我的目标是将某些用户信息存储到系统变量中,以便我可以将这些变量用于未来的解决方案,作为配置文件的替代方法。 然而,下面代码中描述的方法并没有帮助我。
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系统设置的环境变量选项卡中找不到它们。以上代码基本上没有达到我的目的。这个问题在这里讨论:变量保存问题
os.environ.putenv(key, value)
又一次不成功的尝试。最终,我通过模仿 os 包中 system 类包装的 Windows shell 命令,成功地将变量保存在窗口环境注册表中。以下代码描述了这个成功的尝试。
os.system("SETX {0} {1} /M".format(key, value))
我希望这对你们中的一些人有所帮助。setx
用于像"PATH"变量这样重要的东西,当该变量超过1024个字符时,您整个现有的环境配置都会被破坏。也没有办法撤销它。不要使用它。即使微软也不知道得更好。 - Amit Naidu如果我执行 os.environ["DEBUSSY"] = 1,它会报错说 1 必须是字符串。
那么可以这样做:
os.environ["DEBUSSY"] = "1"
我也想知道如何在 Python 中读取环境变量(在脚本的后面部分),一旦我设置了它。
只需使用os.environ["DEBUSSY"]
,如下所示:
some_value = os.environ["DEBUSSY"]
设置变量:
使用键进行项目分配的方法:
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!
方法三:
'DEBUSSY' in os.environ # will return Boolean True/False
第四种方法:
os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements
在这里,os.environ["DEBUSSY"] = '1'
是什么意思呢?环境变量总是字符串。
set [<name>=[<value>]]
,但它只对当前运行的进程有效。当我关闭cmd时,它就不存在了,即使它是打开的,其他程序也看不到它。 - Filip请注意,如果您尝试将环境变量设置为bash评估,它不会保存您期望的内容。例如:
from os import environ
environ["JAVA_HOME"] = "$(/usr/libexec/java_home)"
这不会像在Shell中那样进行评估,因此您将获得文字表达式$(/usr/libexec/java_home)
,而不是路径/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
。
确保在设置环境变量之前对其进行评估,如下所示:
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}")
你可以使用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