cx-freeze、runpy、multiprocessing - 障害への複数のパス 質問する

cx-freeze、runpy、multiprocessing - 障害への複数のパス 質問する

これは少し複雑なので、時間がかかるかもしれません。

基本的な問題は、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 がインストールされていることを確認してください。次に、すべての依存関係を取得します。

omn​​itool を 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 を適切に収集していませんでした。

解決策は次のとおりでした。

  1. Pythonのプレーンバージョンをインストールする
  2. プロジェクトに必要なパッケージを備えた環境を作成する
  3. cx_freeze を実行します。

魔法のように、すべての問題は解消され、すべてが想定どおりにコンパイルされました。

おすすめ記事