1

当我在 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:未定义符号:_PyCodecInfo_GetIncrementalEncoder

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

不知道如何解决

4

3 回答 3

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
于 2015-12-09T15:29:33.587 回答
2

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

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

问题是Python 次要次要版本之间的某些函数之间的不匹配(这不会破坏任何向后兼容性,顺便说一句)。让我详细说明:

  • 构建时间:构建 uwsgi 时构建是针对Python 2.7.10 (如您指定的)。Python可能已经编译/构建:

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

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

  • 蟒蛇核
  • 动态(或扩展)模块(用C编写) -位于${PYTHON_LIB_DIR}/lib-dynload中的.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(显然)不使用导出的函数(因此,在导入时没有抱怨)
  • 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 ) ,或者 - 换句话说 -使用您打算运行它的相同Python版本构建uwsgi !

于 2015-12-09T00:15:28.347 回答
0

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

bash

这让我的脚本运行良好。

于 2017-07-23T17:47:05.600 回答