如何使用cx_Freeze冻结双模式(GUI和控制台)应用程序?

时间:2010-05-21 15:02:47

标签: python wxpython cx-freeze

我开发了一个在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重定向到其他地方。

是否可以让它与两种模式一起使用?似乎没有任何类似的东西记录在任何地方。 :(

提前致谢。

Mridang

2 个答案:

答案 0 :(得分:13)

我在this页面上找到了这个位:

  

无控制台版本的提示:如果   你会尝试打印任何东西   得到一个讨厌的错误窗口,因为   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中所做的,   太。)

答案 1 :(得分:2)

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

我建议发送两个可执行文件 - cli和gui one。