我在Windows上。我正在尝试编写一个 Python 2.x 脚本(我们称之为setup.py
),它将启用以下场景:
- 用户运行 cmd 打开控制台窗口
- 在该控制台窗口中,用户运行
setup.py
- 用户发现自己在同一个控制台窗口中,但现在在那里运行的 cmd 的环境(环境变量)已被修改
setup.py
setup.py
FOO
通过添加一个带有 value的新环境变量foo
并在 . 中添加一些东西来修改环境PATH
。
在 Linux 上,我会简单地使用os.exec*e
配置环境的 shell 替换 Python 进程。
我在 Windows 上尝试了相同的方法(如os.exec*e(os.environ['ComSpec'])
),但它不起作用,新执行的 cmd 的环境是这样的:
运行只是
set
没有列出FOO
,也没有显示对PATH
. 跑步set FOO
,然而,显示FOO=foo
和echo %FOO%
回声foo
。运行
set PATH
或echo %PATH%
显示修改后的PATH
变量。在没有修改的情况下运行set path
或echo %path%
显示值(即使环境变量在 Windows 上通常不区分大小写)。如果我输入
exit
,conole 将保持挂起状态,不接受输入,直到我点击Ctrl+C
. 之后,它显然又回到了cmd
最初调用的那个setup.py
。
很明显,os.exec*e
不适用于 Windows 上的这种情况。有没有不同的方法来实现我想要的?是否有subprocess.Popen()
标志组合可以让我退出调用 Python 进程并让被调用的 cmd 运行,最好是在同一个控制台中?还是会CreateProcess
通过ctypes
帮助访问?
如果有必要,我会满足于启动一个新的控制台窗口并关闭旧的,但我当然不能让旧的控制台窗口处于冻结状态,等待新创建的窗口关闭。