【问题标题】:Running a process in pythonw with Popen without a console在没有控制台的情况下使用 Popen 在 python 中运行进程
【发布时间】:2010-12-21 07:05:55
【问题描述】:

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

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

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

【问题讨论】:

  • 这些命令通常会在控制台中运行吗?您是否正在尝试运行另一个没有控制台的 GUI 程序?

标签: python user-interface console popen pythonw


【解决方案1】:

来自here

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

【讨论】:

  • @Isquare1 我不知道你指的是什么。
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

只要subprocess.Popen([command], shell=True)

【讨论】:

  • 什么pyw 文件?他需要运行一个外部应用程序。
  • 这就像一个魅力。你不需要.pyw 文件。
【解决方案4】:

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

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

win32api.WinExec(chrome + " " + args)

【讨论】:

    【解决方案5】:

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

    variable = subprocess.Popen(
       "CMD COMMAND", 
       stdout = subprocess.PIPE, creationflags = subprocess.CREATE_NO_WINDOW
    )
    

    【讨论】:

    • 你能解释一下为什么这样可以解决问题吗?谢谢!
    • Python 2.7 中没有这样的标志
    • 这一行“from subprocess import Popen, PIPE, CREATE_NO_WINDOW”将把你从上面例子中的所有前缀添加中拯救出来。 (以防万一您希望代码更紧凑。)
    猜你喜欢
    • 2023-03-24
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多