Как я могу заморозить приложение Dual-Mode (GUI и Console), используя CX_FREEZE?

StackOverflow https://stackoverflow.com/questions/2883205

  •  04-10-2019
  •  | 
  •  

Вопрос

Я разработал приложение 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top