7

我开发了一个在 GUI 模式和控制台模式下运行的 Python 应用程序。如果指定了任何参数,它将以控制台模式运行,否则以 GUI 模式运行。

我已经设法使用 cx_Freeze 冻结它。我在隐藏会随 wxPython 弹出的黑色控制台窗口时遇到了一些问题,因此我修改了我的setup.py脚本,如下所示:

import sys

from cx_Freeze import setup, Executable

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
        name = "simple_PyQt4",
        version = "0.1",
        description = "Sample cx_Freeze PyQt4 script",
        executables = [Executable("PyQt4app.py", base = base)])

这工作正常,但现在当我尝试打开控制台并从那里运行可执行文件时,它不会输出任何内容。我没有收到任何错误或消息,因此 cx_Feeze 似乎正在将标准输出重定向到其他地方。

是否有可能让它在两种模式下都工作?任何地方似乎都没有类似的记录。:(

提前致谢。

日当

4

2 回答 2

14

我在页面上找到了这一点:

无控制台版本的提示:如果您尝试打印任何内容,您将得到一个令人讨厌的错误窗口,因为 stdout 和 stderr 不存在(并且 cx_freeze Win32gui.exe 存根将显示一个错误窗口)。当您希望您的程序能够在 GUI 模式和命令行模式下运行时,这是一种痛苦。要安全地禁用控制台输出,请在程序开头执行以下操作:

try:
    sys.stdout.write("\n")
    sys.stdout.flush()
except IOError:
    class dummyStream:
        ''' dummyStream behaves like a stream but does nothing. '''
        def __init__(self): pass
        def write(self,data): pass
        def read(self,data): pass
        def flush(self): pass
        def close(self): pass
    # and now redirect all default streams to this dummyStream:
    sys.stdout = dummyStream()
    sys.stderr = dummyStream()
    sys.stdin = dummyStream()
    sys.__stdout__ = dummyStream()
    sys.__stderr__ = dummyStream()
    sys.__stdin__ = dummyStream()

这样,如果程序以无控制台模式启动,即使代码包含打印语句,它也能工作。如果在命令行模式下运行,它将照常打印出来。(这基本上也是我在 webGobbler 中所做的。)

于 2010-07-13T14:02:19.987 回答
2

Raymond Chen 写过这篇文章:http: //blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx。简而言之,直接在 Windows 下是不可能的,但有一些解决方法。

我建议提供两个可执行文件 - cli 和 gui 一个。

于 2010-06-05T08:37:08.533 回答