Windows上的Python os.exec将控制权返回给调用进程

2024-10-08 19:23:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现一个Python脚本,该脚本将修改环境,然后在新环境下执行一个命令。首先,我一直在尝试利用os.execvpe,如下面的示例(envtest.py):

import os
import sys

def main():
    env = dict(os.environ)
    env["FOO"] = "BAR"
    os.execvpe(sys.argv[1], sys.argv[1:], env=env)

if __name__ == "__main__":
    main()

这在Linux上似乎工作得很好。例如,如果我调用脚本python envtest.py bash,我会得到一个新的bashshell和我的额外环境变量集。如果我查看流程树,我的新环境是前一个shell的子环境,当我退出时,控制返回到前一个shell。这就是我想要的行为

在Windows上,我看到了一些不同的东西,如果我执行python envtest.py cmd,我会看到类似的行为。“我的环境”集生成了一个新的命令提示符,但似乎控件也返回到了父命令提示符。这两个命令提示最终都处于活动状态,并且它们似乎彼此交替(至少我观察到的是这种行为)。下面是一个互动示例,它引导我得出这个结论:

C:\Temp>python envtest.py cmd

C:\Temp>Microsoft Windows [Version 10.0.17763.1217]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Temp>echo %FOO%
%FOO%

C:\Temp>echo %FOO%
BAR

C:\Temp>echo %FOO%
%FOO%

C:\Temp>echo %FOO%
BAR

有没有一种方法可以让python脚本用另一个进程替换自己,而不将控制权返回到Windows上的父进程?另一种方法是python脚本生成子进程并退出,其中子进程是python脚本父进程的子进程,即生成的进程树如下所示:

cmd.exe
\_ cmd.exe

而不是:

cmd.exe
\_ python.exe
   \_ cmd.exe

Tags: pyechoenv脚本cmd环境进程os

热门问题