我需要在Python脚本中设置一些环境变量,我希望从Python调用的所有其他脚本都能看到环境变量的设置。
如果我这样做了,
os.environ["DEBUSSY"] = 1
它抱怨说1必须是一个字符串。
我还想知道如何读取Python中的环境变量(在脚本的后一部分),一旦我设置它。
我需要在Python脚本中设置一些环境变量,我希望从Python调用的所有其他脚本都能看到环境变量的设置。
如果我这样做了,
os.environ["DEBUSSY"] = 1
它抱怨说1必须是一个字符串。
我还想知道如何读取Python中的环境变量(在脚本的后一部分),一旦我设置它。
当前回答
你应该把字符串值赋给环境变量。
操作系统。environ["DEBUSSY"] = "1"
如果您想读取或打印环境变量,请使用
打印os.environ(“德彪西”)
此更改仅对分配该值的当前进程有效,不会永久更改该值。子进程将自动继承父进程的环境。
其他回答
应该注意的是,如果您试图将环境变量设置为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"])
子进程自动继承父进程的环境——您不需要做任何特殊的操作。
我写了这个小的上下文管理器,它只在缩进块的持续时间内设置变量:
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)
那么os呢?environ["DEBUSSY"] = '1'?环境变量总是字符串。
当您使用环境变量(添加/修改/删除变量)时,一个好的实践是在函数完成时恢复以前的状态。
您可能需要类似于这个问题中描述的modified_environ上下文管理器之类的东西来恢复环境变量。
经典的用法:
with modified_environ(DEBUSSY="1"):
call_my_function()