如何从基础Python脚本生成新shell以运行Python脚本?

33 投票
3 回答
50889 浏览
提问于 2025-04-16 20:13

我成功运行了几个Python脚本,通过一个基础脚本调用它们,使用的是subprocess模块:

subprocess.popen([sys.executable, 'script.py'], shell=True)

不过,这些脚本都会执行一些模拟程序(从一个C++应用程序生成的.exe文件),并在命令行上输出一些结果。所有这些输出都会写到我启动这些脚本的基础命令行里。我想为每个脚本生成一个新的命令行。我尝试过在调用subprocess.call时使用shell=True这个选项(也试过popen),但都没有成功。

我该如何为每个通过subprocess.call生成的进程获取一个新的命令行呢?

我在阅读Spencer建议的关于stdin和stdout的文档时,发现了一个解决这个问题的选项:subprocess.CREATE_NEW_CONSOLE。也许重定向管道也能解决问题,但这似乎是最简单的解决方案(至少对于这个特定的问题)。我刚刚测试过,效果很好:

subprocess.popen([sys.executable, 'script.py'], creationflags = subprocess.CREATE_NEW_CONSOLE)

3 个回答

2

这其实并没有直接回答你的问题。不过我也遇到过关于子进程的问题,发现pexpect这个工具非常有用。

50

如果你想在不同的控制台中打开,可以这样做(在Windows 7和Python 3上测试过):

from sys import executable
from subprocess import Popen, CREATE_NEW_CONSOLE

Popen([executable, 'script.py'], creationflags=CREATE_NEW_CONSOLE)

input('Enter to exit from this launcher script...')
10

Popen已经可以生成一个子进程来处理事情。你只需要把输出的管道重定向一下。可以看看subprocess的文档,特别是关于popen的输入、输出和错误输出重定向的部分。

如果你不重定向这些管道,它们会从父进程那里继承过来。要小心不要让你的进程出现死锁的情况。

你想要为每个子进程打开额外的窗口,这个也可以做到。可以查看startupinfo部分的内容。它解释了在Windows上设置哪些选项可以为每个子进程启动一个新的终端。注意,这需要使用shell=True这个选项。

撰写回答