当我在 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]
不知道怎么解决
最佳答案
在将 Python 从 2.7.3 升级到 2.7 时,我遇到了与 uwsgi 相同(或更好:类似)的问题.10:
- 我尝试导入的模块是 socket (socket.py)
- 依次尝试导入 _socket (_socket.so) - 未解析的符号是
_PyInt_AsInt
- 依次尝试导入 _socket (_socket.so) - 未解析的符号是
问题是 Python minor minor 版本之间的某些函数不匹配(这不会破坏任何向后兼容性,BTW)。让我详细说明:
构建时间:构建您的 uwsgi 时,构建是针对 Python 2.7.10 (如您指定的那样)。 Python 可以编译/构建:
- 静态地 - 最有可能是 PYTHON LIBRARY(从现在开始,我将把它称为 PYTHONCORE,因为它是由它的创建者)在这种情况下:(libpython2.7.a) 位于一个静态库中,该库包含在 python 可执行文件中,导致一个巨大的 ~6MB 可执行文件
- 动态 - PYTHONCORE (libpython2.7.so) 是一个动态库,python 可执行 (~ 10KB 字节大,这次)在运行时使用
运行时:上述uwsgi必须在Python 2.7.11环境下运行
无论 Python 是如何编译的,都会发生以下事情:在 2.7.10 和 2.7.11 之间添加了一些内部函数/从两者中删除(在我们的例子中添加):
- Python核心
- 动态(或扩展)模块(用 C 编写)- .so 文件位于 ${PYTHON_LIB_DIR}/lib-dynload (例如 /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(显然)不使用导出的函数(因此,导入 时没有提示)
- PYTHONCORE - 不导出
2.7.11(运行 uwsgi):
- PYTHONCORE - 仍然(因为它在编译(构建)时“嵌入”在 uwsgi 中,所以它仍然是 2.7.10) 不导出
PyCodecInfo_GetIncrementalEncoder
- _io.so - 使用/需要它
- PYTHONCORE - 仍然(因为它在编译(构建)时“嵌入”在 uwsgi 中,所以它仍然是 2.7.10) 不导出
导致 Python 2.7.11 动态模块被用于不受支持的 Python 2.7.10 运行时的情况。
作为结论,请确保您的 uwsgi buildmachine 与 runmachine 同步(来自 Python PoV) >,或者 - 换句话说 - 构建 uwsgi 使用与您打算运行它的相同 Python 版本!
关于python - uwsgi 在 pyenv/2.7.11 下失败,_io.so : undefined symbol: _PyCodecInfo_GetIncrementalEncoder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34167557/