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

如果我这样做了,

os.environ["DEBUSSY"] = 1

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

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


当前回答

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

其他回答

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

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)

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

延迟回答,可以帮助人们快速测试而无需更改代码。只需运行你的应用程序,附上环境变量,如下所示:

 $ DEBUSSY=1 python3 api.py

你可以通过这种方式将env变量传递给任何脚本。

应该注意的是,如果您试图将环境变量设置为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()