22

我有一个带有 GUI 的程序,它通过 Popen 调用运行外部程序:

p = subprocess.Popen("<commands>" , stdout=subprocess.PIPE , stderr=subprocess.PIPE , cwd=os.getcwd())
p.communicate()

但是无论我做什么,都会弹出一个控制台(我也尝试将它传递给 NUL 作为文件句柄)。有没有办法在不获取我调用的二进制文件来释放其控制台的情况下做到这一点?

4

5 回答 5

34

这里

import subprocess

def launchWithoutConsole(command, args):
    """Launches 'command' windowless and waits until finished"""
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    return subprocess.Popen([command] + args, startupinfo=startupinfo).wait()

if __name__ == "__main__":
    # test with "pythonw.exe"
    launchWithoutConsole("d:\\bin\\gzip.exe", ["-d", "myfile.gz"])

请注意,有时抑制控制台会使子进程调用失败,并出现“错误 6:无效句柄”。一个快速的解决方法是重定向stdin,如下所述:Python running as Windows Service: OSError: [WinError 6] The handle is invalid

于 2009-11-28T21:58:35.383 回答
2

做就是了subprocess.Popen([command], shell=True)

于 2017-04-15T11:55:54.310 回答
1

这在 win32api 中运行良好。其他解决方案对我不起作用。

import win32api
chrome = "\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\""
args = "https://stackoverflow.com"

win32api.WinExec(chrome + " " + args)
于 2017-07-03T16:56:01.580 回答
0

根据Python 2.7 文档Python 3.7 文档,您可以通过设置来影响Popen创建过程的方式creationflags。特别是,该CREATE_NO_WINDOW标志对您很有用。

variable = subprocess.Popen(
   "CMD COMMAND", 
   stdout = subprocess.PIPE, creationflags = subprocess.CREATE_NO_WINDOW
)
于 2018-11-26T17:36:15.543 回答
-1

你也许可以做到subprocess.Popen([command], shell=False)

反正我就是这么用的。为您节省所有设置标志和诸如此类的废话。一旦命名为 .pyw 或使用 pythonw 运行,它不应打开控制台。

于 2009-11-28T23:27:55.933 回答