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

时间:2015-12-08 22:48:43

标签: python uwsgi pyenv

当我在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:undefined symbol:_PyCodecInfo_GetIncrementalEncoder

也是uwsgi打印 Python版本:2.7.10(默认,2015年5月30日,13:57:08)[GCC 4.8.2]

不确定如何解决它

3 个答案:

答案 0 :(得分:2)

Python 2.7.3 升级到 2.7时, uwsgi 的问题相同(或更好:类似) 0.10

  • 我尝试导入的模块是 socket socket.py
    • 反过来尝试导入 _socket _socket.so ) - 未解析的符号为_PyInt_AsInt

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

  • 构建时间:构建 uwsgi 时,构建针对 Python 2.7.10 (如您所指定)。 Python 可以编译/构建:

    • 静态 - 很可能是 PYTHON LIBRARY (从现在开始,我将把它称为 PYTHONCORE ,因为它&#39 ;在这种情况下由其创建者命名):( libpython2.7.a )位于静态库中,该库包含在 python 可执行文件中,从而产生了大约6MB的可执行文件
    • 动态 - PYTHONCORE libpython2.7.so )是一个动态库,其中 python 可执行文件(〜 10KB字节大,这次)在运行时使用
  • 运行时:以上 uwsgi 必须在 Python 2.7.11 环境中运行

无论如何编译 Python ,都会发生以下情况:在 2.7.10 2.7.11 之间添加了一些内部函数/从两者中删除(在我们的例子中添加):

  • PYTHONCORE
  • 位于 $ {PYTHON_LIB_DIR} / lib-dynload 中的动态(或扩展)模块(用 C 编写) - .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 (显然)没有使用导出的func(因此, import 时没有抱怨)
  • 2.7.11 (运行 uwsgi ):

    • PYTHONCORE - 仍然(因为它是"嵌入"在 uwsgi 中编译(构建)时间,所以它仍然 2.7.10 )不导出PyCodecInfo_GetIncrementalEncoder
    • _io.so - 使用/需要它

导致 Python 2.7.11 动态模块用于 Python 2.7.10 运行时的情况,这是不受支持的。

作为结论,请确保您的 uwsgi 构建机器与 runmachine Python PoV ) >,或 - 换句话说 - 构建 uwsgi 与您打算运行它的 Python 版本相同!

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

bash

允许我的脚本正常运行。