Как я могу заморозить приложение Dual-Mode (GUI и Console), используя CX_FREEZE?
Вопрос
Я разработал приложение Python, которое запускается как в режиме GUI, так и в режиме консоли. Если указываются какие-либо аргументы, он работает в режиме консоли, иначе он работает в режиме 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 будет отображать окно ошибки). Это боль, когда вы хотите, чтобы ваша программа сможет запустить в режиме 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 тоже.)
Другие советы
Рэймонд Чен написал об этом: http://blogs.msdn.com/b/oldnewhing/archive/2009/01/01/9259142.aspx.. Отказ Короче говоря, это невозможно непосредственно под Windows, но есть некоторые обходные пути.
Я бы предложил доставку двух исполняемых файлов - CLI и GUI One.