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

如果我这样做了,

os.environ["DEBUSSY"] = 1

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

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


当前回答

如果我做os。environ["DEBUSSY"] = 1,它 抱怨说1必须是 字符串。

然后做

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

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

只需使用os。environ["德彪西"],如在

some_value = 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)

管理用户定义的环境变量的一种简单方法是将所有环境变量放在一个文本文件中,并在运行时加载它们。我们可以使用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模块访问这些环境变量,如其他响应中所解释的那样。

我写了这个小的上下文管理器,它只在缩进块的持续时间内设置变量:

import os
from contextlib import contextmanager

@contextmanager
def extended_env(new_env_vars):
    old_env = os.environ.copy()
    os.environ.update(new_env_vars)
    yield
    os.environ.clear()
    os.environ.update(old_env)

示例用法(Windows为%,Linux为$):

import subprocess

subprocess.run("echo $ENVTEST %ENVTEST%", shell=True)

with extended_env({"ENVTEST": "17"}):
    subprocess.run("echo $ENVTEST %ENVTEST%", shell=True)

subprocess.run("echo $ENVTEST %ENVTEST%", shell=True)

你可以使用操作系统。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

如果环境中不存在该变量,则使用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"])