Как я могу заморозить двухрежимное приложение (GUI и консоль), используя cx_Freeze? - PullRequest
6 голосов
/ 21 мая 2010

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

Это работает нормально, но теперь, когда я пытаюсь открыть консользапустить исполняемый файл оттуда, он ничего не выводит.Я не получаю никаких ошибок или сообщений, поэтому кажется, что cx_Feeze перенаправляет стандартный вывод куда-то еще.

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

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

Мриданг

Ответы [ 2 ]

13 голосов
/ 13 июля 2010

Я нашел этот бит на этой странице:

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

2 голосов
/ 05 июня 2010

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

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

...