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

如果我这样做了,

os.environ["DEBUSSY"] = 1

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

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


当前回答

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

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

将变量DEBUSSY设置为字符串1。

要稍后访问此变量,只需使用

print(os.environ["DEBUSSY"])

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

其他回答

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

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

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

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)

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

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

导入应用 在setUp方法中设置环境变量。 使用app.test_client()来测试应用程序

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

应该注意的是,如果您试图将环境变量设置为bash求值,它将不会存储您所期望的内容。例子:

from os import environ

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

这不会像在shell中那样求值,所以不是获取/Library/Java/JavaVirtualMachines/jdk1.8.0_144。你会得到$(/usr/libexec/java_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}")

管理用户定义的环境变量的一种简单方法是将所有环境变量放在一个文本文件中,并在运行时加载它们。我们可以使用python-dotenv包来实现这一点,该包允许我们导入这些变量。该软件包可以通过以下方式安装:

pip install python-dotenv

默认情况下,该模块在当前目录中查找一个名为.env的文件。在这个文件中定义所有的变量,每行一个,如下所示:

DEBUSSY=1    
PATH_TO_EXECUTABLE=/home/user_name/project/run.sh

然后将这些导入到您的环境中,如下所示:

from dotenv import load_dotenv
load_dotenv()

您可以将包含已定义变量的文件的路径指定为load_dotenv的可选参数。随后,可以通过os模块访问这些环境变量,如其他响应中所解释的那样。