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

时间:2011-06-24 14:59:24

标签: python subprocess

我已经成功运行了几个Python脚本,使用子进程模块从基本脚本调用它们:

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

但是,每个脚本都会执行一些模拟(来自C ++应用程序的.exe文件),这些模拟会向shell生成一些输出。所有这些输出都写入我发布这些脚本的基本shell。我想为每个脚本生成一个新shell。我在调用subprocess.call时尝试使用shell=True属性生成新shell(也尝试使用popen),但它不起作用。

如何为使用subprocess.call生成的每个进程获取新shell?

我正在阅读Spencer建议的关于stdin和stdout的文档,并找到了解决问题的标志:subprocess.CREATE_NEW_CONSOLE。也许重定向管道也可以完成工作,但这似乎是最简单的解决方案(至少对于这个特定的问题)。我刚刚对它进行了测试并且工作得很好:

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

3 个答案:

答案 0 :(得分:41)

要在其他控制台中打开,请执行(在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...')

答案 1 :(得分:10)

Popen已经生成了一个处理事物的子流程。您只需要重定向输出管道。查看subprocess文档,特别是关于popen stdin,stdout和stderr重定向的部分。

如果不重定向这些管道,它会从父管道继承它们。请注意使流程陷入僵局。

您希望每个子流程都有其他窗口。这也是处理。查看子进程的startupinfo部分。它解释了在Windows上设置哪些选项来为每个子进程生成一个新终端。请注意,它需要使用shell = True选项。

答案 2 :(得分:2)

这实际上并没有回答你的问题。但是我也遇到了子进程的问题,pexpect结果非常有用。