uwsgi 在 pyenv/2.7.11 下失败 _io.so:未定义符号:_PyCodecInfo_GetIncrementalEncoder

uwsgi fails under pyenv/2.7.11 with _io.so: undefined symbol: _PyCodecInfo_GetIncrementalEncoder

当我在 pyenv 2.7.11 下启动 uwsgi 2.0.11.2 时,我得到:

导入错误:/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]

不确定如何解决

我在从 Python 升级 Python 时遇到与 uwsgi 相同(或更好:类似)的问题=]2.7.3 到 2.7.10:

  • 我尝试导入的模块是 socket (socket.py)
    • 依次尝试导入 _socket (_socket.so) - 未解析的符号是 _PyInt_AsInt

问题是 Python minor minor 版本之间的某些功能不匹配(不会破坏任何向后兼容性,BTW)。让我详细说说:

  • 构建时间:当你的uwsgi构建时,构建是针对Python 2.7.10 (如您指定的那样)。 Python 本来可以 compiled/built:

    • 静态 - 最有可能的是 PYTHON LIBRARY(从现在开始,我将把它称为 PYTHONCORE 由其创建者命名)在这种情况下:(libpython2.7.a) 位于静态库中,该库包含在 python 可执行文件中,导致巨大的 ~6MB 可执行文件
    • 动态 - PYTHONCORE (libpython2.7.so) 是一个动态库,python 可执行文件(这次大约有 10KB 字节)在 运行 时间 [=123] 使用=]
  • 运行时间:上面的uwsgi必须运行在一个Python2.7。 11环境

不管Python如何编译,下面的事情发生了:在2.7.10和[=33=之间]2.7.11 一些内部函数 added/removed (在我们的例子中添加)来自:

  • PYTHON核心
  • 动态(或扩展)模块(用 C 编写)- .so 文件位于 ${PYTHON_LIB_DIR}/lib-dynload(例如/home/user/.pyenv/versions/2.7.11/envs/master2/lib/python2.7/lib-dynload);任何动态模块 (.so) 都是 PYTHONCORE[=123 的客户端=]

所以,基本上是版本不匹配(运行时遇到):

  • 2.7.10(针对uwsgi编译):

    • PYTHONCORE - 不导出 PyCodecInfo_GetIncrementalEncoder
    • _io.so(显然)不使用导出的函数(因此,在 导入 时没有抱怨)
  • 2.7.11uwsgi 运行 反对):

    • PYTHONCORE - 仍然(原来是"embedded" 在 uwsgi 在编译(构建)时,所以它仍然是 2.7.10) 不导出 PyCodecInfo_GetIncrementalEncoder
    • _io.so - uses/needs它

导致 Python 2.7.11 动态模块被用于 Python 2.7.10 运行时间,不支持。

作为结论,请确保您的 uwsgi buildmachine 同步(来自 Python PoV ) 使用 运行machine,或者 - 换句话说 - build uwsgi 使用Python 您打算 运行 使用的相同版本!

CristiFati 介绍了原因部分。我的确切方法是:

cd my_pyenv_virtualenv
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar xf uwsgi-latest.tar.gz
cd uwsgi-2.0.11.2
python uwsgiconfig.py --build
mv uwsgi /home/user/.pyenv/versions/2.7.11/envs/master2/bin/uwsgi

我在 RHEL 上遇到了同样的错误,最终发现这是由于我使用的 tsch shell。我通过切换到 bash shell:

解决了这个问题
bash

这让我的脚本 运行 正常。