Python更改Windows路径(刷新Shell)
我这里有一个Python脚本,它是从Windows CMD调用的。 它正在执行一些命令,并更改Windows环境变量。现在,在我用命令“setx”更改它们之后。我必须重新启动另一个Shell,以便将新变量加载到其中 我调用脚本的主shell是否可以更新变量本身 或者是否可以使用新变量启动另一个shell,脚本将在新打开的shell中继续Python更改Windows路径(刷新Shell),python,windows,variables,Python,Windows,Variables,我这里有一个Python脚本,它是从Windows CMD调用的。 它正在执行一些命令,并更改Windows环境变量。现在,在我用命令“setx”更改它们之后。我必须重新启动另一个Shell,以便将新变量加载到其中 我调用脚本的主shell是否可以更新变量本身 或者是否可以使用新变量启动另一个shell,脚本将在新打开的shell中继续 谢谢,您不能更改环境变量的值 请允许我澄清:环境变量表示流程启动时在流程环境中设置的变量 从新流程的角度来看,其环境是不变的。在环境(进程的父级)上更改变量不会
谢谢,您不能更改环境变量的值 请允许我澄清:环境变量表示流程启动时在流程环境中设置的变量 从新流程的角度来看,其环境是不变的。在环境(进程的父级)上更改变量不会更改进程看到的环境变量的值。更改流程上的变量不会使其环境看到更改 那么,你能改变什么
- 在流程上设置的变量。在python中,可以通过更改
或在shell上使用os.environ
来实现这一点。您的进程和您所做的任何子进程都将看到任何更改(set
,os.system
,shell上的大多数命令)子进程
- 系统设置的变量(SetX的功能)。更改后,系统(资源管理器,在Windows中)直接启动的任何新进程都会看到这些更改
- 进程可以修改自己的环境-这些修改将由以后启动的子进程继承
- 进程可以(在开始时)修改其子进程的环境
- 进程永远不能修改其父级环境(*)
cmd.exe
启动Python脚本时:
- 脚本可以更改自己的环境,并且这些更改将由脚本及其所有子脚本的所有后续命令可见
- 脚本无法更改其父
的环境,也无法更改该cmd.exe
cmd.exe
cmd.exe
,并让这个新shell执行其他命令,或者直接执行.bat
文件(通过子流程
模块)
setx
是一个完全不同的东西:它更新从windows资源管理器(包括cmd.exe)启动的进程的默认环境。该环境永久存储在Windows注册表中,对它的每次更改都会广播到所有活动进程。。。它监视着它。任何windows GUI应用程序都可以处理它(资源管理器也可以——这就是每个资源管理器窗口如何立即知道当前默认环境),但控制台应用程序通常不会
(*)在旧的MS/DOS系统中,
.com
可执行文件曾经是可能的,甚至有文档记录。通过WriteProcessMemory
API调用应该可以在Windows最新系统上实现,但绝对没有文档记录(感谢eryksun的注意)我们可以更好地查看代码以了解发生了什么吗?setx
更改注册表中变量的值,并广播一条消息,使资源管理器重新加载其环境。因此,当您从资源管理器启动新的cmd shell时,它将继承更新的值。cmd本身没有用于侦听WM_SETTINGCHANGE
的消息循环。您可以使用os.environ
dict更新当前环境。这将由subprocess.call('cmd.exe')生成的shell继承
。你是说我可以用子进程调用另一个shell,然后更新我的env变量?默认行为是将Python的当前环境变量复制到子进程。您还可以修改environ=os.environ.copy()
,然后使用subprocess.call('cmd.exe',env=environ)
。另一种方法是在批处理文件中写入值,该批处理文件使用可以在父cmd shell中运行的set
命令(本例中不是setx
)。@eryksun谢谢,我不知道该消息。我已经编辑了澄清的答案,为什么你说你不能在流程环境中修改变量?如果不是这样的话,你认为修改操作系统环境有什么作用?它调用os.putenv
。请参阅MSDN上的基本Windows API。您当然可以修改流程中的变量,但OP的重点是获取流程外新更改变量的值,这就是我强调这一点的原因。这当然是有争议的,但我认为这可能有助于理解。我已经在社区维基上给出了答案,请随意做出您认为合适的更改