我需要在python脚本中设置一些环境变量,我希望从python(shell脚本)调用的所有其他脚本都是子进程来查看环境变量集。该值是一个数字。
如果我os.environ["DEBUSSY"] = 1
,则抱怨说1
必须是字符串。
我也想知道在设置之后如何在python中读取环境变量(在脚本的后面部分)。
答案 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字典,因此可以执行所有常见的字典操作。除了其他答案中提到的get
和set
操作之外,我们还可以简单地检查密钥是否存在
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"]
此更改仅对分配给它的当前进程有效,不会永久更改该值。子进程将自动继承父进程的环境。
答案 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 单元测试你:
setUp
方法中设置环境变量。app.test_client()
测试您的应用进入第二步的变量不会被第三步看到,因为执行第一步时变量已经被读取了。