これは少し複雑なので、時間がかかるかもしれません。
基本的な問題は、Linux (私のテストケースでは Ubuntu) では、cx フリーズされたバージョンの私のプログラム (Omnitool) がサブプロセスを作成できないことです。ただし、Windows 7 では動作します。または、ソース コードから直接実行する場合は動作します。残念ながら、忘れるほど簡単ではありませんfreeze_support
。
問題
サブプロセスを開始するデフォルトの動作は、X サーバーがクラッシュすることです。具体的には次のようになります。
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 23 requests (23 known processed) with 0 events remaining.
[xcb]Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
Omnitool: ../../src/xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
Aborted (core dumped)
Python トレースバックはありません。ctypesXInitThreads
で手動で呼び出してみましたが、正常に設定された場合は 0 が返されますが、それでもクラッシュします。クラッシュの直前に、pygame UI にバグが発生したため、そこに何らかの障害があると思われます。
さて、設定multiprocessing.set_start_method()
変更に関する問題: 「forkserver」は次のような素敵なトレースバックを表示しますが、何も教えてくれません:
代わりに、それを spawn に設定すると、何も実行されなくなります。プロセスが開始され、 を通過します__main__
(prints で証明できます) が、サブプロセスのターゲット関数には決して入りません。
自分自身を試す
Ubuntu または同等の Linux と Python 3.4 がインストールされていることを確認してください。次に、すべての依存関係を取得します。
omnitool を zip としてダウンロードするか、git からクローンします。https://github.com/Berserker66/omnitool次のコードの requirements.txt は Omnitool からのものです。
sudo apt-get update -qq
sudo apt-get install --fix-missing mercurial subversion python3-dev python3-numpy libav-tools libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsmpeg-dev libsdl1.2-dev libportmidi-dev libswscale-dev libavformat-dev libavcodec-dev python3-pip
pip3 install -r requirements.txt
pip3 install cx_Freeze
フリーズするには、引数omnisetup.py
を指定して実行しますbuild
。
また、pyinstallers python 3 フォークでフリーズを試みましたが、これも同様に失敗しました。ただし、spec ファイルは git で追跡されていません。
ベストアンサー1
仕事のプロジェクトで cx_freeze を使用しました。これがあなたの問題かどうかはわかりませんが、私は Anaconda ディストリビューションを使用していましたが、cx_freeze はプロジェクトに必要な .dll を適切に収集していませんでした。
解決策は次のとおりでした。
- Pythonのプレーンバージョンをインストールする
- プロジェクトに必要なパッケージを備えた環境を作成する
- cx_freeze を実行します。
魔法のように、すべての問題は解消され、すべてが想定どおりにコンパイルされました。