Python更改Windows路径(刷新Shell)

时间:2015-04-20 10:09:26

标签: python windows variables

我这里有一个Python脚本,它是从Windows CMD调用的。 它正在执行一些命令,还会更改Windows环境变量。现在我用命令“setx”改变了它们。我必须重新启动另一个Shell,以便将新变量加载到它中。

我调用我的脚本的主shell是否可以更新变量本身?

或者是否可以使用新变量启动另一个shell,脚本将在新打开的shell中继续?

由于

2 个答案:

答案 0 :(得分:2)

每个流程都有自己的环境。当进程启动另一个进程时,新进程将获得其父环境的(最终修改的)副本。

规则是:

  • 进程可以修改自己的环境 - 此修改将由稍后启动的子进程继承
  • 进程可以修改(在开始时)其子进程的环境
  • 流程永远不能修改其父级环境(*)

因此,当您从cmd.exe

启动Python脚本时
  • 脚本可以更改自己的环境,脚本及其所有子项的所有后续命令都可以看到这些更改
  • 该脚本无法更改其父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.systemsubprocess,shell上的大多数命令都会看到任何更改。

  • 系统设置的变量(SetX的作用)。 更改后,系统直接启动的任何新进程(Windows中的资源管理器)都会看到这些更改。