Я разработал приложение 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 где-то в другом месте.
Возможно заставить это работать с обоими режимами? Ничто подобное этому, кажется, не документируется нигде.:(
Заранее спасибо.
Mridang
Я нашел этот кусочек на этой странице:
Совет для версии без консоли: Если вы попытаетесь напечатать что-либо, вы получите неприятное окно ошибки, потому что stdout и stderr не существуют (и заглушка cx_freeze Win32gui.exe будет отобразит окно ошибки). Это боль, когда вы хотите, чтобы ваша программа работать в режиме графического интерфейса и в режиме командной строки. Чтобы безопасно отключить консольный вывод, сделайте следующее в начале вашей программы:
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/oldnewthing/archive/2009/01/01/9259142.aspx . Короче говоря, это невозможно непосредственно под Windows, но есть некоторые обходные пути.
Я бы посоветовал поставить два исполняемых файла - cli и gui one.