【问题标题】:How can I spawn new shells to run Python scripts from a base Python script?如何生成新的 shell 以从基本 Python 脚本运行 Python 脚本?
【发布时间】:2011-09-22 02:47:28
【问题描述】:

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

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)

【问题讨论】:

  • 您的意思是要在不同的终端窗口中运行脚本吗?如果是这样,您使用的是什么终端程序?
  • @unutbu:是的,我想在不同的终端窗口中运行每个脚本。我正在使用基本的 Window 终端(只是运行 cmd)
  • @Eder:我对 Windows 了解不多。这有帮助吗:stackoverflow.com/questions/303838/…? (即start cmd.exestart python script.py ...)
  • @Eder 你应该接受斯宾塞的回答。
  • @Jim:谢谢!这是我第二次,我不知道。

标签: python subprocess


【解决方案1】:

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

【讨论】:

  • Python 3 使用输入而不是 raw_input。
  • 啊啊啊啊啊啊啊啊!!!刚才我花了 30 分钟才找到这个特定的答案。谢谢,希望您能再获得 10K 的支持。
  • 感谢您的回答,不幸的是 CREATE_NEW_CONSOLE 似乎不适用于 python 2.7。有什么办法吗?
  • 很遗憾,CREATE_NEW_CONSOLE 只能用于 Windows 操作系统。 (Source)
【解决方案2】:

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

如果您不重定向这些管道,它会从父级继承它们。只是要小心死锁你的进程。

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

【讨论】:

    【解决方案3】:

    这实际上并不能回答您的问题。但是我也遇到了 subprocess 的问题,pexpect 真的很有帮助。

    【讨论】:

    • 我怀疑 pexpect 会有很大帮助,因为它需要 pth 模块,因为 Windows 不支持它(我相信 OP 正在使用它,因为他提到运行“.exe”文件)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 2021-12-15
    • 2020-10-08
    • 2020-01-01
    • 1970-01-01
    相关资源
    最近更新 更多