我需要在Python脚本中设置一些环境变量,我希望从Python调用的所有其他脚本都能看到环境变量的设置。

如果我这样做了,

os.environ["DEBUSSY"] = 1

它抱怨说1必须是一个字符串。

我还想知道如何读取Python中的环境变量(在脚本的后一部分),一旦我设置它。


当前回答

在使用此方法之前,请浏览评论部分

我一直在尝试添加环境变量。我的目标是将一些用户信息存储到系统变量中,这样我就可以在未来的解决方案中使用这些变量,作为配置文件的替代品。 然而,下面代码中描述的方法对我没有任何帮助。

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包的系统类中的windows shell命令,成功地在窗口环境寄存器中保存变量。下面的代码描述了这个成功的尝试。

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

我希望这对你们中的一些人有所帮助。

其他回答

有一个很好的开箱即用的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)

操作系统。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

>>> 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模块时被捕获, 通常在Python启动时作为处理site.py的一部分。变化 到环境做出来以后,这个时候都不体现出来 操作系统。Environ,除了修改os. Environ所做的更改。直接环境。

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

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

环境是为代码本身(而不是子进程)冻结的,不能通过编程方式完成。

一个好的解决方案,不管是什么平台,都是将对python的调用包装在一个批处理文件中。例如:如果我在linux上,批处理文件可能看起来像这样

export "DEBUSSY"="1"
python mycode.py

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

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

import os

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

print(os.environ["DEBUSSY"])

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

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

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)