7

GUIモードとコンソールモードの両方で実行される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がstdoutを別の場所にリダイレクトしているようです。

両方のモードで動作させることは可能ですか?これに似たものはどこにも文書化されていないようです。:(

前もって感謝します。

ムリダン

4

2 に答える 2

14

私はこのページでこのビットを見つけました:

コンソールレスバージョンのヒント:何かを印刷しようとすると、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()

このように、プログラムがコンソールレスモードで起動すると、コードにprintステートメントが含まれていても機能します。また、コマンドラインモードで実行すると、通常どおりに出力されます。(これは基本的に私がwebGobblerで行ったことでもあります。)

于 2010-07-13T14:02:19.987 に答える
2

Raymond Chenはこれについて次のように書いています:http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx。つまり、Windowsの直下では不可能ですが、いくつかの回避策があります。

cliとguiの2つの実行可能ファイルを出荷することをお勧めします。

于 2010-06-05T08:37:08.533 に答える