我这里有一个 Python 脚本,它是从 Windows CMD 调用的。 它正在执行一些命令并更改 Windows 环境变量。现在我用命令“setx”改变了它们。我必须重新启动另一个 Shell,以便将新变量加载到其中。
我调用脚本的主 shell 是否可以更新变量本身?
或者是否可以使用新变量启动另一个 shell,脚本将在新打开的 shell 中继续?
谢谢
最佳答案
每个进程都有自己的环境。当一个进程启动另一个进程时,新进程会获得其父环境的(最终修改的)副本。
规则是:
- 一个进程可以修改它自己的环境——这个修改将被以后启动的子进程继承
- 进程可以(在启动时)修改其子进程的环境
- 进程永远不能修改其父进程的环境 (*)
因此,当您从 cmd.exe
启动 Python 脚本时:
- 脚本可以改变它自己的环境,这些变化将被脚本及其所有子脚本的所有后续命令可见
- 脚本不能更改其父
cmd.exe
的环境,也不能更改该cmd.exe
的后续命令的环境
如果换环境后需要执行其他批处理命令,则需要为python脚本启动一个新的cmd.exe
,让这个新的shell执行其他命令,或者直接执行.bat
文件(均通过 subprocess
模块)。
setx
是一个完全不同的东西:它更新提供给从 Windows 资源管理器(包括 cmd.exe)启动的进程的默认环境。该环境永久存储在 Windows 注册表中,并且对其进行的每次更改都会广播到所有事件进程......监视它。任何 Windows GUI 应用程序都可以处理它(资源管理器可以 - 这就是每个资源管理器窗口立即知道当前默认环境是什么的方式),但控制台应用程序通常不会。
(*) 好吧,在旧的 MS/DOS 系统中,.com
可执行文件曾经是可能的,甚至被记录在案。在 Windows 最新系统上应该可以通过 WriteProcessMemory
API 调用,但绝对没有记录(感谢 eryksun 注意到)
关于Python 更改 Windows 路径(刷新 Shell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29744940/