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.11(uwsgi 运行 反对):
- 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
这让我的脚本 运行 正常。
当我在 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
- 依次尝试导入 _socket (_socket.so) - 未解析的符号是
问题是 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(显然)不使用导出的函数(因此,在 导入 时没有抱怨)
- PYTHONCORE - 不导出
2.7.11(uwsgi 运行 反对):
- PYTHONCORE - 仍然(原来是"embedded" 在 uwsgi 在编译(构建)时,所以它仍然是 2.7.10) 不导出
PyCodecInfo_GetIncrementalEncoder
- _io.so - uses/needs它
- PYTHONCORE - 仍然(原来是"embedded" 在 uwsgi 在编译(构建)时,所以它仍然是 2.7.10) 不导出
导致 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
这让我的脚本 运行 正常。