根据我的阅读,Python实例中对环境变量的任何更改仅在该实例中可用,并在实例关闭后消失。有什么方法可以让他们坚持到系统吗?
我需要这样做的原因是因为在我工作的工作室,像Maya这样的工具严重依赖环境变量来配置跨多个平台的路径。
我的测试代码是
import os
os.environ['FAKE'] = 'C:\\'
打开另一个Python实例并请求os.environ['FAKE']
会产生KeyError
。
注意:可移植性将是一个问题,但我正在编写的小API将能够检查操作系统版本并在必要时触发不同的命令。
也就是说,我已经走了使用Windows注册表技术的路线,只会编写替代方法,在其他平台上调用shell脚本,因为它们已成为需求。
答案 0 :(得分:9)
让他们坚持承诺 系统?
我觉得你在这里有点困惑。没有“系统”环境。每个进程都有自己的环境作为其内存的一部分。流程只能改变自己的环境。流程可以为其创建的流程设置初始环境。
如果您确实认为需要为系统设置环境变量,则需要在最初加载的位置更改它们,例如Windows上的注册表或Linux上的shell配置文件。
答案 1 :(得分:8)
您可以在命令行中使用SETX。
默认情况下,这些操作会在USER env vars上进行。 要设置和修改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))
答案 2 :(得分:7)
在Windows下,您可以使用this recipe通过注册表对环境变量进行持久更改,但这似乎有点过分。
回应Brian的问题,你想要完成什么?可能有一种更简单的方法。
答案 3 :(得分:5)
我不相信你能做到这一点;我能想到两种解决方法。
os.putenv
函数为您开始的进程设置环境,即os.system,popen等。根据您要执行的操作,也许您可以拥有一个主Python实例设置变量,然后生成新实例。
您可以运行一个shell脚本或批处理文件来为您设置它,但这样便于移植。见文章:
答案 4 :(得分:3)
根据this discussion,你不能这样做。你想要完成什么?
答案 5 :(得分:3)
以这种方式思考。
您没有设置shell环境变量。
您正在使用某些给定的环境变量设置生成子shell;此子shell使用修改后的环境运行您的应用程序。
答案 6 :(得分:2)
您正在分配新进程,并且无法更改父进程的环境,因为如果从shell启动新的shell进程,则无法执行此操作
答案 7 :(得分:1)
您可能想尝试由Mark Hammond开发的Python Win32 Extensions,它包含在ActivePython中(或可以单独安装)。您可以在Hammond's and Robinson's book中了解如何执行许多与Windows相关的任务。
使用 PyWin32 访问windows COM对象,Python程序可以使用WScript.Shell
的{{3}}(环境变量的集合)对象
答案 8 :(得分:1)
似乎有更简单的Windows解决方案
import subprocess
subprocess.call(['setx', 'Hello', 'World!'], shell=True)
答案 9 :(得分:0)
从Python内部?不,它无法完成!
如果你没有绑定Python,你应该考虑使用shell脚本(sh,bash等)。 “source”命令允许您运行一个修改环境的脚本,并且会像你想要的那样“粘贴”你“源”脚本的shell。这里发生的是shell直接执行脚本而不是创建一个子-process来执行脚本。
这将非常便携 - 您可以在Windows上使用cygwin来执行此操作。
答案 10 :(得分:0)
尝试使用允许您通过注册表设置变量的 py-setenv
python -m pip install py-setenv
答案 11 :(得分:-2)
如果有人可能需要此信息。我意识到这是在7年前问的,但即使我忘记了有时候。
是的,有一种方法可以让它们“坚持”在窗户中。只需转到控制面板,系统,高级系统设置,当系统属性窗口打开时,您应该看到环境变量的选项(按钮)。根据您正在使用的操作系统(google it),获取此功能的过程略有不同。
选择(单击按钮),然后将打开“环境变量”窗口。它有2个分割窗口,顶部窗口应该是您的“用户名变量”。 。 。选择“新”,然后简单地设置变量。例如,我的一个是“Database_Password = mypassword”。
然后在您的应用程序中,您可以像这样访问它们:import os,os.environ.get('Database_Password')。您可以执行pass = os.environ.get('Database_Password')
。