如何在Python中进行环境variables更改?

从我读过的内容来看,Python实例中的环境variables的任何更改都只在该实例中可用,并且在实例closures后消失。 有没有什么办法让他们坚持下来,让他们进入系统?

我需要这样做的原因是因为在我工作的工作室,像Maya这样的工具严重依赖于环境variables来跨多个平台configurationpath。

我的testing代码是

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

打开另一个Python实例并请求os.environ['FAKE']产生一个KeyError

注:可移植性将是一个问题,但是我写的小API将能够检查操作系统版本,并在必要时触发不同的命令。

也就是说,我已经走了使用Windowsregistry技术的路线,并将简单地编写替代方法,在其他平台上调用shell脚本,因为它们成为需求。

在Windows下,你可以通过这个配方对registry中的环境variables进行持久化修改 ,尽pipe看起来像是过度杀毒。

为了回应Brian的问题,你想完成什么? 有可能是一个更简单的方法。

让他们坚持承诺他们的系统?

我想你在这里有点困惑。 没有“系统”环境。 每个进程都有自己的环境作为其内存的一部分。 一个进程只能改变自己的环境。 进程可以为其创build的进程设置初始环境。

如果你真的认为你需要为系统设置环境variables,你需要看看他们最初加载的位置,比如在windows上的registry或者在Linux上的shellconfiguration文件。

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

  1. os.putenv函数为你开始的进程设置环境,比如os.system,popen等。根据你想要做的事情,也许你可以有一个主variables设置variables,然后产生新的实例。

  2. 你可以运行一个shell脚本或者batch file来为你设置,但是这个脚本的可移植性要低得多。 看到这篇文章:

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

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

默认情况下,这些操作在USER环境中进行。 要设置和修改SYSTEMvariables,请使用/ 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)) 

根据这个讨论 ,你不能这样做。 你想完成什么?

想想这样。

你没有设置shell环境variables。

你正在用一些给定的环境variables设置产生一个子shell。 这个子shell使用修改后的环境运行你的应用程序。

如果从shell启动一个新的shell进程,您正在分叉一个新进程,并且无法更改父进程的环境

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

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

似乎有更简单的Windows解决scheme

 import subprocess subprocess.call(['setx', 'Hello', 'World!'], shell=True) 

从Python内? 不,不能做!

如果你没有绑定到Python,你应该考虑使用shell脚本(sh,bash等)。 “source”命令允许你运行一个修改环境的脚本,并且像你想要的脚本一样“粘住”脚本。这里发生的事情是shell直接执行脚本,而不是创build一个子脚本进程来执行脚本。

这将是相当便携的 – 你可以在Windows上使用cygwin来做到这一点。

如果有人可能需要这个信息。 我意识到这是7年前问的,但即使我有时也忘记了。 。

是的,有一种方法可以使他们在Windows中“粘”。 简单的去控制面板,系统,高级系统设置,当系统属性窗口打开时,你应该看到一个选项(button)的环境variables。 。根据你使用的操作系统(谷歌),这个过程有点不同。

select(单击button),然后打开环境variables窗口。 它有两个拆分窗口,最上面的应该是你的“用户名”的用户variables。 。 select“新build”,然后简单地设置variables。 比如我的一个是“Database_Password = mypassword”。

然后在你的应用程序中,你可以像这样访问它们:import os,os.environ.get('Database_Password')。 你可以做一些像pass = os.environ.get('Database_Password')