Mri*_*lla 6 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)])
Run Code Online (Sandbox Code Playgroud)
这工作正常,但现在当我尝试打开我的控制台并从那里运行可执行文件时,它不会输出任何内容.我没有收到任何错误或消息,因此似乎cx_Feeze正在重定向其他地方的stdout.
有可能让它与两种模式一起使用吗?似乎没有任何类似的东西记录在任何地方.:(
提前致谢.
Mridang
Mri*_*lla 13
我在这个页面上找到了这个位:
无控制台版本的提示:如果您尝试打印任何内容,您将得到一个讨厌的错误窗口,因为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()
Run Code Online (Sandbox Code Playgroud)
这样,如果程序在无控制台模式下启动,即使代码包含print语句,它也能正常工作.如果在命令行模式下运行,它将照常打印出来.(这基本上也是我在webGobbler中所做的.)