我这里有一个Python脚本,它是从Windows CMD调用的。 它正在执行一些命令,还会更改Windows环境变量。现在我用命令“setx”改变了它们。我必须重新启动另一个Shell,以便将新变量加载到它中。
我调用我的脚本的主shell是否可以更新变量本身?
或者是否可以使用新变量启动另一个shell,脚本将在新打开的shell中继续?
由于
答案 0 :(得分:2)
每个流程都有自己的环境。当进程启动另一个进程时,新进程将获得其父环境的(最终修改的)副本。
规则是:
因此,当您从cmd.exe
:
cmd.exe
的环境,也无法更改cmd.exe
的后续命令如果您需要在更改环境后执行其他批处理命令,则必须为python脚本启动新的cmd.exe
并让此新shell执行其他命令,或直接执行{{1} } file(都来自.bat
模块)。
subprocess
是一个完全不同的东西:它更新了从Windows资源管理器(包括cmd.exe)启动的进程的默认环境。该环境永久存储在Windows注册表中,对其进行的每个更改都会广播到监视它的所有活动进程。任何Windows GUI应用程序都可以处理它(而且资源管理器会这样做 - 这就是每个资源管理器窗口如何立即知道当前的默认环境),但控制台应用程序通常不会。
(*)以前它曾经可以用于旧的MS / DOS系统中的setx
可执行文件,甚至可以记录。它应该可以在Windows最近的系统上通过.com
API调用,但绝对没有记录(感谢eryksun注意)
答案 1 :(得分:1)
您无法更改环境变量的值。
请允许我澄清一下:环境变量表示该流程开始时在流程环境中设置的变量。
从新流程的角度来看,其环境是不变的。更改环境中的变量(进程'父级)将不更改进程看到的环境变量的值。更改流程中的变量将不使其环境看到更改。
那么,可以你改变什么?
在您的进程中设置的变量。这是通过更改os.environ
或在shell上使用set
在python中实现的。您的流程和您创建的任何子项(os.system
,subprocess
,shell上的大多数命令都会看到任何更改。
系统设置的变量(SetX
的作用)。 更改后,系统直接启动的任何新进程(Windows中的资源管理器)都会看到这些更改。