python - uwsgi 在 pyenv/2.7.11 下失败,_io.so : undefined symbol: _PyCodecInfo_GetIncrementalEncoder

标签 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]

不知道怎么解决

最佳答案

在将 Python2.7.3 升级到 2.7 时,我遇到了与 uwsgi 相同(或更好:类似)的问题.10:

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

问题是 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.102.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(显然)不使用导出的函数(因此,导入 时没有提示)
  • 2.7.11(运行 uwsgi):

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

导致 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/

相关文章:

python - Chromedriver、Selenium - 自动下载

python - Django Rest Framework - 如何重组 json 响应?

python - Flask + uWSGI + Nginx + Fedora 20 设置问题

python - 将 Mac OS 升级到 Sierra 后,箭头键在 Python shell 中不再起作用

python - 如何在 Ubuntu 上升级 pyenv 版本

python dicttoxml 多次使用相同的键

python - 安装 uwsgi 时出错 pip : "Python.h no such file". 安装了 python-dev 和 python3-dev 包

uwsgi - 如何杀死uWSGI进程

python - 仅使用虚拟环境文件夹运行 python 脚本

python - 为什么 aiohttp 比 run_in_executor 包装的请求慢?