subprocess.Popen creationflags

时间:2017-07-14 13:26:57

标签: python windows subprocess windows-console

我想生成一个子进程,如果一切都在后台发生而不打开一个新的Windows控制台,那将会很好。

首先我认为我的代码出了问题,因为它会在向子进程发送输入时导致错误。 像字符串这样的命令,例如生成错误

  

未知动作:tring

意思是,有时会丢失通过stdin.write发送到子流程的输入的第一个字符。

这就是代码:

    self.sp = subprocess.Popen(
        args,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE
    )

现在我尝试了以下内容,一切正常。问题是新开放的安慰。

    self.sp = subprocess.Popen(
        args,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        creationflags = subprocess.CREATE_NEW_CONSOLE
    )

有没有另一种方法可以在不打开新的Windows控制台的情况下实现这一目标?

您的链接引导我对CREATE_NEW_WINDOW标志的描述

  

进程还可以通过指定来创建控制台   在调用CreateProcess时CREATE_NEW_CONSOLE标志。这种方法   创建一个可供子进程访问但不能访问的新控制台   到父进程。父母和孩子都可以使用独立的控制台   进程与用户进行交互而不会发生冲突。 如果是这个标志   在创建控制台进程时未指定,两个进程都是   附在同一个控制台上,并不能保证   正确的流程将收到针对它的输入。 应用程序   可以通过创建不继承的子进程来防止混淆   输入缓冲区的句柄,或者只启用一个子进程   在阻止父进程的同时继承输入缓冲区句柄的时间   从阅读控制台输入到孩子完成的过程。

如果可以在不打开窗口的情况下创建新控制台。

这似乎已经解决了问题

bufsize=1

谢谢。

1 个答案:

答案 0 :(得分:0)

“是否有另一种方法可以在不打开新的 Windows 控制台的情况下实现这一目标?” 就在这里 ! 您可以使用创建标志 CREATE_NO_WINDOW,如下所示:creationflags=subprocess.CREATE_NO_WINDOW

瞧!没有窗户!