我已经开发了一个以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似乎正在将Stdout重定向其他地方。

有可能使它与两种模式一起使用吗?似乎在任何地方都没有与此相似的记录。 :(

提前致谢。

米丹

有帮助吗?

解决方案

我发现这一点 页:

无机版本的提示:如果您尝试打印任何内容,则会获得一个讨厌的错误窗口,因为Stdout和stderr不存在(并且CX_FREEZE WIN32GUI.EXE.EXE Stub将显示一个错误窗口)。当您希望程序能够以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中所做的。)

其他提示

雷蒙德·陈(Raymond Chen)写了这一点: http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx. 。简而言之,在窗户下不可能,但是有一些解决方法。

我建议运送两个可执行文件-CLI和GUI一个。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top