如何使Python中的环境变量更改生效?

29

根据我所了解的,对Python实例中环境变量的任何更改只在该实例内有效,并且在关闭实例后会消失。有没有办法通过将它们提交到系统来使它们保留下来?

我需要这样做的原因是因为在我工作的工作室中,像Maya这样的工具在多个平台上配置路径时 heavily 依赖于环境变量。

我的测试代码是

import os
os.environ['FAKE'] = 'C:\\'

打开另一个 Python 实例并请求 os.environ['FAKE'] 会导致 KeyError 错误。

注意:可移植性可能会成为问题,但我正在编写的小型 API 将能够检查操作系统版本并在必要时触发不同的命令。

话虽如此,我选择使用 Windows 注册表技术,并将编写替代方法,以便在其他平台上调用 shell 脚本时满足需求。


1
对于Windows,我可以推荐使用一个模块通过注册表来设置变量。同时,该模块也有命令行应用程序:https://github.com/beliaev-maksim/py_setenv,可以很好地控制用户/系统级别,并且在长度上没有setx的限制。 - Beliaev Maksim
12个回答

22

你可以在命令行中使用 SETX。

默认情况下,这些操作会应用于用户环境变量。若要设置和修改系统变量,请使用 /M 标记。

import os
env_var = "BUILD_NUMBER"
env_val = "3.1.3.3.7"
os.system("SETX {0} {1} /M".format(env_var,env_val))

10
在Windows系统中,使用SETX命令的一个大问题是它不能改变当前环境变量,甚至不能影响从该命令启动的命令行窗口 - 您必须退出当前窗口并打开一个新的窗口才能使其生效。 - Steve Barnes
1
我错过了什么 - 这似乎是最简单的? - Steven
3
注意:这可能会截断您的PATH环境变量,例如根据系统,可能只保留前1024个符号。最好先备份并制定恢复策略。 - Bob
@SteveBarnes 有没有一种方法可以在不重启 shell 或 IDE 的情况下设置环境? - datalifenyc
1
@datalifenyc - 我还没有发现。 - Steve Barnes

10

如何让它们保持在系统中并且不会被修改?

我认为你可能有些困惑了。没有“系统”环境,每个进程都有自己的环境,作为其内存的一部分。进程只能更改自己的环境变量,可以为创建的进程设置初始环境。如果你真的需要为系统设置环境变量,你需要查看最初加载它们的位置,例如 Windows 的注册表或 Linux 上的 shell 配置文件,并进行更改。


13
在“系统”环境变量中,Soviut指的是在整个系统范围内建立的变量,例如Unix中通常为/etc/profile或在Windows中作为系统(而非用户)环境变量。从他的语境可以看出,我认为这很清楚。 - Jeff Bauer

6
似乎Windows有更简单的解决方案。
import subprocess 
subprocess.call(['setx', 'Hello', 'World!'], shell=True)

你必须小心使用这个,因为如果变量已经存在,它会覆盖当前变量的值。 - RaduS
请小心,这会将您的值截断为前1024个字符! - Hossein

6
在Windows下,你可以通过这个方法将环境变量的更改持久化到注册表中,但这似乎有些过度。和Brian问的一样,你想要实现什么目标?可能有更简单的方法。

3
为什么从系统管理员的标准语言来看,将环境变量持久化设置被称为过度杀伐? - Piotr Dobrogost
2
@Jeff,真的吗?你不明白为什么有人想要使环境变量永久存在吗?这是一个古老的问题!(提示:在程序之间传递变量)然后,“可能有更简单的方法”是什么意思?更简单的方法用于什么? :) - Apostolos

5

我不相信你能做到这一点;我可以想到两个解决方法。

  1. os.putenv函数设置进程的环境,例如os.system,popen等。根据你尝试做什么,也许你可以有一个主Python实例来设置变量,然后生成新的实例。

  2. 你可以运行一个shell脚本或批处理文件来为你设置它,但这变得不太可移植。请参阅这篇文章:

http://code.activestate.com/recipes/159462/


3

这样想一下。

你不是在设置 shell 环境变量。

你是在生成一个子 shell,并使用一些给定的环境变量设置;这个子 shell 使用修改后的环境来运行你的应用程序。


这样想吧,他正在设置系统范围内的默认shell环境变量 :) 话虽如此,你的观点也是有道理的,并且指向了通过用Python脚本替换可执行文件来设置环境,然后运行这些可执行文件来解决问题的方向。+1 - Piotr Dobrogost
1
@Piotr Dobrogost:这样想吧。通常来说,设置系统范围内的默认shell环境变量似乎不是一个很好的主意。我曾经尝试过,但当人们需要独特的环境时,它会带来管理上的噩梦。 - S.Lott

2
根据这篇讨论,你无法这样做。你想要实现什么目标?

我正在尝试制作一个环境切换器,可以在多个平台上调整环境变量。 - Soviut
@Soviut,你为什么要尝试更改环境变量? - Zoredache
2
这是为了我们能够在不同的项目之间切换,因为我们的3D应用程序严重依赖于环境变量。 - Soviut

2

您正在分叉一个新进程,无法更改父进程的环境,就像从shell启动新的shell进程一样无法更改其环境一样。


1

你可能想要尝试由Mark Hammond开发的Python Win32扩展,它包含在ActivePython中(或可以单独安装)。你可以学习如何执行许多与Windows相关的任务在Hammond和Robinson的书中。

使用PyWin32访问Windows COM对象,Python程序可以使用WScript.Shell对象的环境属性(一组环境变量)。


1
使用上述方法调用 setx 标准 Windows 程序的优势是什么?它并不更具可移植性,而且更加复杂。 - Piotr Dobrogost

0
尝试使用py-setenv,它可以让您通过注册表设置变量。 < p > < code > python -m pip install py-setenv


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接