我需要在Python脚本中设置一些环境变量,我希望从Python调用的所有其他脚本都能看到环境变量的设置。
如果我这样做了,
os.environ["DEBUSSY"] = 1
它抱怨说1必须是一个字符串。
我还想知道如何读取Python中的环境变量(在脚本的后一部分),一旦我设置它。
我需要在Python脚本中设置一些环境变量,我希望从Python调用的所有其他脚本都能看到环境变量的设置。
如果我这样做了,
os.environ["DEBUSSY"] = 1
它抱怨说1必须是一个字符串。
我还想知道如何读取Python中的环境变量(在脚本的后一部分),一旦我设置它。
当前回答
如果你纠结于Flask和unittest,请记住,如果你在任何方法之外设置了一个变量,当你导入应用程序时,这个变量会被读取。可能看起来微不足道,但可以省去一些麻烦。
例如,如果进入你的Flask单元测试你:
导入应用 在setUp方法中设置环境变量。 使用app.test_client()来测试应用程序
进入第二步的变量到第三步时将不会看到,因为在执行第一步时已经读取了该变量。
其他回答
那么os呢?environ["DEBUSSY"] = '1'?环境变量总是字符串。
下面这些呢?
os.environ["DEBUSSY"] = '1'
debussy = int(os.environ.get('DEBUSSY'))
print(type(debussy))
<类“int”>
应该注意的是,如果您试图将环境变量设置为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}")
你可以使用操作系统。Environ字典来访问环境变量。
现在,我遇到的一个问题是,如果我尝试使用操作系统。系统运行一个批处理文件来设置你的环境变量(在**.bat*文件中使用SET命令),它不会真正为你的python环境设置它们(但是为os. bat创建的子进程设置)。系统功能)。为了在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
延迟回答,可以帮助人们快速测试而无需更改代码。只需运行你的应用程序,附上环境变量,如下所示:
$ DEBUSSY=1 python3 api.py
你可以通过这种方式将env变量传递给任何脚本。