【问题标题】:pyinstaller on Windows with --noconsole simply won't work带有 --noconsole 的 Windows 上的 pyinstaller 根本不起作用
【发布时间】:2014-08-18 18:30:27
【问题描述】:

我有一个相当简单的 GUI (wxPython) 应用程序并且运行良好。我使用的是 Windows 7。
当使用pyinstaller-w(或--noconsole--windowed)编译它并运行它时,我可以看到一个控制台窗口一毫秒然后它关闭。 GUI 应用程序无法运行。
不使用 -w 进行编译将生成一个带有控制台窗口的工作应用程序。

我在这里错过了什么?

【问题讨论】:

  • 尝试使用 -clean 选项。控制台闪烁一秒钟可能会显示错误。尝试从命令提示符运行您构建的 exe 文件。
  • 已经尝试过同样的结果。
  • 嗯。您可能想尝试使用 py2exe 并查看结果是否相同。

标签: python windows wxpython pyinstaller


【解决方案1】:

遇到了同样的问题。使用以下函数代替subprocess.Popen()

def popen(cmd):
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    process = subprocess.Popen(cmd, startupinfo=startupinfo, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    return process.stdout.read()

返回类型与您从 Popen().communicate()[0] 获得的类型相同 :) 非常适合我的 GUI 应用程序。用 pyinstaller --noconsole 窗口化...

【讨论】:

  • Leon,你的代码帮我解决了我的问题。 My GUI Issue。非常感谢!
【解决方案2】:

我猜你是在以某种方式启动一个子进程,当 Python 在没有控制台窗口的情况下运行时会搞砸。我必须解决与此相关的三个问题:

  1. multiprocessing 模块在生成工作进程时需要 set an environment variable
  2. subprocess 模块需要 explicitly handle stdinstdoutstderr,因为没有为要继承的子进程设置标准文件句柄。
  3. 子进程创建一个控制台窗口,除非你tell it not to

【讨论】:

  • 我发现第 2 点有效 - 明确处理标准输入、标准输出和标准错误。我们只在子进程中处理了 stdout 和 stderr,但是一旦我们处理了 stdin,它就可以完美地工作了。
  • 几年后,我发现了这一点,#2 也解决了我的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2014-12-09
  • 2023-03-22
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多