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

如果我这样做了,

os.environ["DEBUSSY"] = 1

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

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


当前回答

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

其他回答

下面这些呢?

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}")

当您使用环境变量(添加/修改/删除变量)时,一个好的实践是在函数完成时恢复以前的状态。

您可能需要类似于这个问题中描述的modified_environ上下文管理器之类的东西来恢复环境变量。

经典的用法:

with modified_environ(DEBUSSY="1"):
    call_my_function()

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

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

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

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

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