Как я могу заморозить двойной режим (GUI и консоль) приложение с помощью 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 где-то в другом месте.

Возможно заставить это работать с обоими режимами? Ничто подобное этому, кажется, не документируется нигде.:(

Заранее спасибо.

Mridang

6
задан Mridang Agarwalla 7 May 2014 в 09:32
поделиться

2 ответа

Я нашел этот кусочек на этой странице:

Совет для версии без консоли: Если вы попытаетесь напечатать что-либо, вы получите неприятное окно ошибки, потому что 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, тоже.)

13
ответ дан 8 December 2019 в 15:59
поделиться

Раймонд Чен написал об этом: http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx . Короче говоря, это невозможно непосредственно под Windows, но есть некоторые обходные пути.

Я бы посоветовал поставить два исполняемых файла - cli и gui one.

2
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: