1

pyenv 2.7.11 で uwsgi 2.0.11.2 を起動すると、次のようになります。

ImportError: /home/user/.pyenv/versions/2.7.11/envs/master2/lib/python2.7/lib-dynload/_io.so: 未定義のシンボル: _PyCodecInfo_GetIncrementalEncoder

また、uwsgi は Python バージョンを出力します: 2.7.10 (デフォルト、2015 年 5 月 30 日、13:57:08) [GCC 4.8.2]

それを修正する方法がわからない

4

3 に答える 3

2

Python2.7.3から2.7.10にアップグレードするときに、 uwsgiで同じ (またはより良い: 同様の) 問題が発生しました。

  • インポートしようとしたモジュールはソケット( socket.py ) でした
    • 次に_socket ( _socket.so )をインポートしようとしましたが、未解決のシンボルは_PyInt_AsInt

問題は、 Pythonの マイナー マイナーリリース間で一部の関数が一致していないことです (下位互換性は失われませんが、ところで)。詳細を聞かせてください:

  • ビルド時間: uwsgiがビルドされたとき、ビルドはPython 2.7.10に対して行われました (指定したとおり)。Pythonはコンパイル/ビルドされている可能性があります。

    • 静的 - ほとんどの場合、PYTHON LIBRARY (以降、作成者によって名前が付けられているため、 PYTHONCOREと呼ぶことにします) : ( libpython2.7.a ) は静的 lib に含まれており、python実行可能ファイルにより、巨大な ~6MB の実行可能ファイルが生成されます
    • 動的 - PYTHONCORE ( libpython2.7.so ) は、 Python実行可能ファイル (今回は最大 10KB のバイト) が実行時に使用する動的ライブラリです。
  • 実行時: 上記のuwsgiはPython 2.7.11環境で実行する必要があります

Pythonのコンパイル方法に関係なく、次のことが起こりました: 2.7.102.7.11の間で、いくつかの内部関数が追加/削除されました (この場合は追加されました):

  • パイソンコア
  • 動的 (または拡張) モジュール ( Cで記述) - ${PYTHON_LIB_DIR}/lib-dynloadにある.soファイル(例: /home/user/.pyenv/versions/2.7.11/envs/master2/lib/python2.7 /lib-dynload ); 任意の動的モジュール ( .so ) はPYTHONCOREのクライアントです

したがって、基本的にはバージョンの不一致です (実行時に発生します):

  • 2.7.10 ( uwsgiに対してコンパイルされたもの):

    • PYTHONCORE - エクスポートしませんPyCodecInfo_GetIncrementalEncoder
    • _io.so (明らかに) エクスポートされた関数を使用しません (したがって、インポート時に文句はありません)
  • 2.7.11 ( uwsgiが実行される):

    • PYTHONCORE -まだ(コンパイル (ビルド)時に uwsgiに「埋め込まれた」ため、まだ2.7.10です) エクスポートしませんPyCodecInfo_GetIncrementalEncoder
    • _io.so - 使用/必要

その結果、サポートされていないPython 2.7.10ランタイムに対してPython 2.7.11動的モジュールが使用されたという状況が発生しました。

結論として、uwsgi buildmachine が (Python PoV から) runmachine と同期していることを確認してください。つまり 実行する予定の同じバージョンPythonでuwsgiをビルドしてください。

于 2015-12-09T00:15:28.347 に答える