我需要在Python脚本中设置一些环境变量,我希望从Python调用的所有其他脚本都能看到环境变量的设置。
如果我这样做了,
os.environ["DEBUSSY"] = 1
它抱怨说1必须是一个字符串。
我还想知道如何读取Python中的环境变量(在脚本的后一部分),一旦我设置它。
我需要在Python脚本中设置一些环境变量,我希望从Python调用的所有其他脚本都能看到环境变量的设置。
如果我这样做了,
os.environ["DEBUSSY"] = 1
它抱怨说1必须是一个字符串。
我还想知道如何读取Python中的环境变量(在脚本的后一部分),一旦我设置它。
当前回答
应该注意的是,如果您试图将环境变量设置为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}")
其他回答
环境变量必须是字符串,因此使用
import os
os.environ["DEBUSSY"] = "1"
将变量DEBUSSY设置为字符串1。
要稍后访问此变量,只需使用
print(os.environ["DEBUSSY"])
子进程自动继承父进程的环境——您不需要做任何特殊的操作。
管理用户定义的环境变量的一种简单方法是将所有环境变量放在一个文本文件中,并在运行时加载它们。我们可以使用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模块访问这些环境变量,如其他响应中所解释的那样。
应该注意的是,如果您试图将环境变量设置为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}")
如果环境中不存在该变量,则使用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)