Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python更改Windows路径(刷新Shell)_Python_Windows_Variables - Fatal编程技术网

Python更改Windows路径(刷新Shell)

Python更改Windows路径(刷新Shell),python,windows,variables,Python,Windows,Variables,我这里有一个Python脚本,它是从Windows CMD调用的。 它正在执行一些命令,并更改Windows环境变量。现在,在我用命令“setx”更改它们之后。我必须重新启动另一个Shell,以便将新变量加载到其中 我调用脚本的主shell是否可以更新变量本身 或者是否可以使用新变量启动另一个shell,脚本将在新打开的shell中继续 谢谢,您不能更改环境变量的值 请允许我澄清:环境变量表示流程启动时在流程环境中设置的变量 从新流程的角度来看,其环境是不变的。在环境(进程的父级)上更改变量不会

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

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

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


谢谢,您不能更改环境变量的值

请允许我澄清:环境变量表示流程启动时在流程环境中设置的变量

从新流程的角度来看,其环境是不变的。在环境(进程的父级)上更改变量不会更改进程看到的环境变量的值。更改流程上的变量不会使其环境看到更改

那么,你能改变什么

  • 在流程上设置的变量。在python中,可以通过更改
    os.environ
    或在shell上使用
    set
    来实现这一点。您的进程和您所做的任何子进程都将看到任何更改(
    os.system
    子进程
    ,shell上的大多数命令)

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


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

规则是:

  • 进程可以修改自己的环境-这些修改将由以后启动的子进程继承
  • 进程可以(在开始时)修改其子进程的环境
  • 进程永远不能修改其父级环境(*)
因此,当您从
cmd.exe
启动Python脚本时:

  • 脚本可以更改自己的环境,并且这些更改将由脚本及其所有子脚本的所有后续命令可见
  • 脚本无法更改其父
    cmd.exe
    的环境,也无法更改该
    cmd.exe
如果更改环境后需要执行其他批处理命令,则必须为python脚本启动一个新的
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的重点是获取流程外新更改变量的值,这就是我强调这一点的原因。这当然是有争议的,但我认为这可能有助于理解。我已经在社区维基上给出了答案,请随意做出您认为合适的更改