Windows上使用--noconsole的pyinstaller无法正常工作

4 投票
3 回答
5654 浏览
提问于 2025-04-18 11:20

我有一个相对简单的图形界面应用程序(用wxPython做的),运行得很好。我在使用Windows 7。
当我用 pyinstaller 编译它时,加上 -w(或者 --noconsole--windowed),然后运行这个程序,我能看到一个控制台窗口闪现了一下,然后就关闭了。结果这个图形界面应用程序根本不运行。
如果不加 -w 选项,就能生成一个带控制台窗口的正常应用程序。

我这里缺少了什么呢?

3 个回答

0

如果你在使用 subprocess.run(),确保它的写法是这样的:

if os.name == 'nt':
    subprocess.run(command, creationflags=subprocess.CREATE_NO_WINDOW)

要小心,subprocess.CREATE_NO_WINDOW 在非Windows系统上会报错。

5

我猜你的程序可能在启动一个子进程时出现了问题,这种情况在没有控制台窗口的情况下运行Python时会发生。我遇到过三个和这个相关的问题:

  1. multiprocessing模块在创建工作进程时需要设置一个环境变量
  2. subprocess模块需要明确处理 stdinstdoutstderr,因为标准的文件句柄不会自动传递给子进程。
  3. 子进程会创建一个控制台窗口,除非你告诉它不要这样做
8

我也遇到过同样的问题。于是我用了下面这个函数,替代了 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] 得到的是一样的哦 :) 这个方法在我的图形界面应用中效果很好。我用 pyinstaller --noconsole 打包成窗口应用...

撰写回答