如何使环境变量更改在 Python 中生效?
- 2025-03-11 08:54:00
- admin 原创
- 38
问题描述:
据我所知,对 Python 实例中的环境变量的任何更改都仅在该实例中可用,并且在实例关闭后消失。有没有办法通过将它们提交到系统来保留它们?
我需要这样做的原因是,在我工作的工作室,像 Maya 这样的工具严重依赖环境变量来配置跨多个平台的路径。
我的测试代码是
import os
os.environ['FAKE'] = 'C:\\'
打开另一个 Python 实例并请求os.environ['FAKE']
产生一个KeyError
。
注意:可移植性是一个问题,但我编写的小型 API 将能够检查操作系统版本并在必要时触发不同的命令。
也就是说,我已经采用了使用 Windows 注册表技术的路线,并且将简单地编写替代方法,以便在其他平台上需要时调用 shell 脚本。
解决方案 1:
您可以在命令行使用 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))
解决方案 2:
让他们加入这个系统并坚持下去?
我觉得你在这里有点困惑。没有“系统”环境。每个进程都有自己的环境作为其内存的一部分。进程只能更改自己的环境。进程可以为其创建的进程设置初始环境。
如果您确实认为需要为系统设置环境变量,那么您需要考虑在它们最初加载的位置更改它们,例如 Windows 上的注册表或 Linux 上的 shell 配置文件。
解决方案 3:
在 Windows 下,您可以使用此方法通过注册表使对环境变量的更改持久化,尽管这似乎有点小题大做。
回应 Brian 的问题,你想实现什么?可能有更简单的方法。
解决方案 4:
似乎 Windows 有更简单的解决方案
import subprocess
subprocess.call(['setx', 'Hello', 'World!'], shell=True)
解决方案 5:
我不相信你能做到这一点;我能想到两种解决方法。
该
os.putenv
函数为您启动的进程设置环境,即 os.system、popen 等。根据您要执行的操作,也许您可以有一个主 Python 实例来设置变量,然后生成新实例。您可以运行 shell 脚本或批处理文件来为您设置它,但这样做的可移植性会大大降低。请参阅本文:
http://code.activestate.com/recipes/159462/
解决方案 6:
这样想想吧。
您没有设置 shell 环境变量。
您正在使用一些给定的环境变量设置生成一个子 shell;该子 shell 使用修改后的环境运行您的应用程序。
解决方案 7:
根据此讨论,您无法做到这一点。您想要实现什么目的?
解决方案 8:
您正在分叉一个新进程,并且无法更改父进程的环境,就像您从 shell 启动新 shell 进程时无法更改一样
解决方案 9:
您可能想尝试由 Mark Hammond 开发的Python Win32 Extensions,它包含在ActivePython中(或可以单独安装)。您可以在Hammond 和 Robinson 的书中学习如何执行许多与 Windows 相关的任务。
使用PyWin32访问 Windows COM 对象,Python 程序可以使用该对象的环境属性(环境变量的集合)WScript.Shell
。
解决方案 10:
尝试使用 py-setenv,它允许您通过注册表设置变量
python -m pip install py-setenv
解决方案 11:
从 Python 内部?不,这不可能!
如果您不局限于 Python,则应考虑使用 shell 脚本(sh、bash 等)。“source”命令允许您运行修改环境的脚本,并将“粘”到您“source”脚本的 shell 中。这里发生的事情是 shell 直接执行脚本,而不是创建子进程来执行脚本。
这将非常易于移植 - 您可以在 Windows 上使用 cygwin 来执行此操作。
解决方案 12:
以防有人需要这些信息。我知道这个问题是 7 年前问的,但有时我也会忘记是怎么问的。。
是的,有一种方法可以让它们“粘”在 Windows 中。只需转到控制面板、系统、高级系统设置,当系统属性窗口打开时,您应该会看到一个环境变量选项(按钮)。根据您使用的操作系统,获取此信息的过程略有不同(谷歌搜索)。
选择它(单击按钮),然后环境变量窗口将打开。它有 2 个分割窗口,上面的窗口应该是您的“您的用户名的用户变量”。...选择“新建”,然后只需设置变量即可。例如,我的一个是“Database_Password = mypassword”。
然后,您可以在应用中像这样访问它们:import os, os.environ.get('Database_Password')。您可以执行类似以下操作pass = os.environ.get('Database_Password')
。