CX_FREEZEを使用してデュアルモード(GUIおよびコンソール)アプリケーションをフリーズするにはどうすればよいですか?
質問
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をリダイレクトしているようです。
両方のモードで動作させることは可能ですか?これに似たものはどこにでも文書化されているようには見えません。 :(
前もって感謝します。
ムリダン
解決
私はこのビットを見つけました これ ページ:
コンソールのないバージョンのヒント:何かを印刷しようとすると、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/oldnewthing/archive/2009/01/01/9259142.aspx. 。要するに、Windowsの直接は不可能ですが、いくつかの回避策があります。
CLIとGUI 1の2つの実行可能ファイルを出荷することをお勧めします。