如何在Python中使环境变量更改?

Sov*_*iut 19 python environment-variables

根据我的阅读,Python实例中对环境变量的任何更改仅在该实例中可用,并在实例关闭后消失.是否有任何方法可以通过将它们提交给系统来使它们坚持下去?

我需要这样做的原因是因为在我工作的工作室,像Maya这样的工具在很大程度上依赖于环境变量来配置跨多个平台的路径.

我的测试代码是

import os
os.environ['FAKE'] = 'C:\\'
Run Code Online (Sandbox Code Playgroud)

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

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

也就是说,我已经走了使用Windows注册表技术的路线,只会编写替代方法,在其他平台上调用shell脚本,因为它们成为需求.

Zor*_*che 9

通过将它们提交给系统来使它们坚持下去?

我觉得你在这里有点困惑.没有"系统"环境.每个进程都有自己的环境作为其内存的一部分.流程只能改变自己的环境.进程可以为其创建的进程设置初始环境.

如果您确实认为需要为系统设置环境变量,则需要在最初加载的位置更改它们,例如Windows上的注册表或Linux上的shell配置文件.

  • 通过"系统"环境变量,Soviut指的是系统范围内建立的变量,例如Unix中的/ etc/profile或Windows中的System(vs. User)环境变量.我认为从他的背景来看这很清楚. (5认同)

Jor*_*lli 9

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

默认情况下,这些操作会在USER环境中进行.要设置和修改SYSTEM变量,请使用/ 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))
Run Code Online (Sandbox Code Playgroud)

  • Windows上`SETX`的一个大问题是它不会改变当前环境甚至是从它启动的命令shell - 你必须退出shell并启动一个新的. (3认同)
  • 注意:这可能会截断您的 PATH 环境变量,例如截断为前 1024 个符号,具体取决于系统。最好先做好备份并制定恢复策略。 (3认同)

Jef*_*uer 6

在Windows下,您可以使用此配方通过注册表对环境变量进行持久更改,尽管它看起来有点矫枉过正.

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

  • 为什么设置环境的变量从(将)系统管理员的标准语言持续被称为过度杀手? (3认同)
  • @杰夫,真的吗?您不明白为什么要使环境变量永久化?这是一个古老的问题!:)(提示:在程序之间传递变量)然后,“可能有一个更简单的方法”是什么意思?更简单的方法是什么?:) (2认同)

小智 6

似乎有更简单的 Windows 解决方案

import subprocess 
subprocess.call(['setx', 'Hello', 'World!'], shell=True)
Run Code Online (Sandbox Code Playgroud)


DNS*_*DNS 5

我不相信你能做到这一点; 我能想到两种解决方法.

  1. os.putenv函数为您开始的进程设置环境,即os.system,popen等.根据您要执行的操作,可能您可以拥有一个设置变量的主Python实例,然后生成新实例.

  2. 您可以运行shell脚本或批处理文件来为您设置它,但这样便可移植性降低.看到这篇文章:

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