【问题标题】:launch a python console and control its output启动 python 控制台并控制其输出
【发布时间】:2021-03-31 17:53:22
【问题描述】:

我需要启动一个 python 控制台并控制它的输出。我正在使用 python subprocess.Popen() 创建一个新实例。

我将以下代码保存在 python 脚本中并从 Windows 命令提示符运行它。当我运行脚本时,它会在当前 Windows 命令提示符中启动 python 实例,不要在单独的控制台中启动它。

p = subprocess.Popen(["C:\Python31\python.exe"], shell=False,
          #       stdin=subprocess.PIPE,
                 stdout=subprocess.PIPE)
out, _ = p.communicate()
print(out.decode())

【问题讨论】:

  • 仅供参考,以后要注意的是标准输出是缓冲的。因此,如果您没有按预期获得输出,您可以尝试手动刷新或使用 stderr。

标签: python subprocess


【解决方案1】:

在 Windows 中,您可以使用 CREATE_NEW_CONSOLE 创建标志在新的控制台会话中生成子进程:

from subprocess import Popen, CREATE_NEW_CONSOLE, PIPE

p = Popen(["C:\Python31\python.exe"], creationflags=CREATE_NEW_CONSOLE)

【讨论】:

  • 新打开的控制台打开并消失
  • 因为我需要控制输出,所以我必须使用 stdout=subprocess.PIPE
  • 我还观察到,如果我在命令中使用参数,那么新打开的控制台再次打开并消失 p = Popen(["C:\Python31\python.exe C:\demo.py"] , creationflags=CREATE_NEW_CONSOLE)
【解决方案2】:

如果您在 Windows 上,您可以使用 win32console 模块为您的线程或子进程输出打开第二个控制台。如果您在 Windows 上,这是最简单、最简单的方法。

这是一个示例代码:

import win32console
import multiprocessing

def subprocess(queue):
    win32console.FreeConsole() #Frees subprocess from using main console
    win32console.AllocConsole() #Creates new console and all input and output of subprocess goes to this new console
    while True:
        print(queue.get())
        #prints any output produced by main script passed to subprocess using queue

if __name__ == "__main__": 
    queue = multiprocessing.Queue()
    multiprocessing.Process(target=subprocess, args=[queue]).start()
    while True:
        print("Hello World in main console")
        queue.put("Hello work in sub process console")
        #sends above string to subprocess and it prints it into its console

        #and whatever else you want to do in ur main process

您也可以通过线程来做到这一点。如果你想要队列功能,你必须使用队列模块,因为线程模块没有队列

这里是win32console module documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多