Python subprocess.run未抑制所有控制台输出

Python subprocess.run未抑制所有控制台输出,python,windows,subprocess,python-3.7,console-output,Python,Windows,Subprocess,Python 3.7,Console Output,stdout=DEVNULL和stderr=stdout的subprocess.run不会抑制该实用程序的所有输出 我猜subinacl.exe正在调用另一个进程,该进程打印未被抑制的输出。难道不是stdout=DEVNULL和stderr=stdout沉默整个流程链的输出吗?根据Eryk Sun的评论,我不得不使用 subprocess.run( 'subinacl.exe /service "foo" display', stdout=subprocess.DEVNULL,

stdout=DEVNULL和stderr=stdout的subprocess.run不会抑制该实用程序的所有输出


我猜subinacl.exe正在调用另一个进程,该进程打印未被抑制的输出。难道不是stdout=DEVNULL和stderr=stdout沉默整个流程链的输出吗?

根据Eryk Sun的评论,我不得不使用

subprocess.run(
    'subinacl.exe /service "foo" display',
    stdout=subprocess.DEVNULL,
    stderr=subprocess.STDOUT, 
    creationflags=subprocess.CREATE_NO_WINDOW
)

根据Erik Sun的评论,我不得不使用

subprocess.run(
    'subinacl.exe /service "foo" display',
    stdout=subprocess.DEVNULL,
    stderr=subprocess.STDOUT, 
    creationflags=subprocess.CREATE_NO_WINDOW
)

这里不需要shell=True,因为您没有运行shell命令。重写标准句柄不会阻止进程打开控制台的活动屏幕缓冲区,即CONOUT$,或通过CreateConsolesScreenbuffer创建新的屏幕缓冲区。如果您不想要任何可见的输出,您有三个选项:1使用creationflags=Distached_进程在没有控制台会话的情况下运行它;在这种情况下,您应该将所有未使用的标准句柄重定向到DEVNULL。2使用creationflags=CREATE_NO_WINDOW分配一个没有窗口的新控制台会话,即GetConsoleWindow返回NULL。3使用creationflags=CREATE_NEW_CONSOLE和startupinfo=STARTUPINFOdwFlags=STARTF_USESHOWWINDOW分配一个带有隐藏窗口的新控制台会话。就我而言,有效的方法是stdout=subprocess.PIPE、stderr=subprocess.PIPE、creationfags=subprocess.CREATE_NO_window如果不打算动态读取管道,就不应该使用管道,比如通过交流。管道的容量有限,通常为4K。在它满了之后,向它写入数据会被阻塞。这可能会阻止程序的执行。如果您使用空设备,程序可以写入stdout或stderr而不会阻塞。这里不需要shell=True,因为您没有运行shell命令。覆盖标准句柄不会阻止进程打开控制台的活动屏幕缓冲区,即CONOUT$,或通过CreateConsoleScreenBuffer创建新的屏幕缓冲区。如果您不想要任何可见的输出,您有三个选项:1使用creationflags=Distached_进程在没有控制台会话的情况下运行它;在这种情况下,您应该将所有未使用的标准句柄重定向到DEVNULL。2使用creationflags=CREATE_NO_WINDOW分配一个没有窗口的新控制台会话,即GetConsoleWindow返回NULL。3使用creationflags=CREATE_NEW_CONSOLE和startupinfo=STARTUPINFOdwFlags=STARTF_USESHOWWINDOW分配一个带有隐藏窗口的新控制台会话。就我而言,有效的方法是stdout=subprocess.PIPE、stderr=subprocess.PIPE、creationfags=subprocess.CREATE_NO_window如果不打算动态读取管道,就不应该使用管道,比如通过交流。管道的容量有限,通常为4K。在它满了之后,向它写入数据会被阻塞。这可能会阻止程序的执行。如果使用空设备,程序可以写入stdout或stderr而不会阻塞。因为它正在写入没有窗口的控制台,所以重定向标准句柄是可选的。重定向到空设备可能会提高性能,因为Windows控制台是迄今为止我使用过的最慢的终端,但是你有像subinacl.exe这样的程序,它可以直接打开CONOUT$,而不考虑标准I/O。此外,如果程序可能通过stdin进行交互,例如需要用户按键的分页输出,它还可以帮助将stdin重定向到空设备,以便所有读取立即返回为空EOF。如果它为此打开CONIN$,则必须使用creationflags=Distached_进程,并希望程序在打开CONIN$失败时能够正常工作,因为没有控制台会话。由于它正在写入没有窗口的控制台,因此重定向标准句柄是可选的。重定向到空设备可能会提高性能,因为Windows控制台是迄今为止我使用过的最慢的终端,但是你有像subinacl.exe这样的程序,它可以直接打开CONOUT$,而不考虑标准I/O。此外,如果程序可能通过stdin进行交互,例如需要用户按键的分页输出,它还可以帮助将stdin重定向到空设备,以便所有读取立即返回为空EOF。如果它为此打开了CONIN$,那么您必须使用creationflags=DETACHED_进程,并希望在打开CONIN$失败时程序能够正常工作,因为没有控制台会话。