如何从基础Python脚本生成新shell以运行Python脚本?
我成功运行了几个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这个选项。