如何使用cx_freeze冻结双模式(GUI和控制台)应用程序?
题
我已经开发了一个以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一个。
不隶属于 StackOverflow