在将Python从2.7.3升级到2.7.10时,我遇到了与uwsgi相同(或更好:类似)的问题:
- 我尝试导入的模块是socket ( socket.py )
- 反过来又试图导入_socket ( _socket.so ) - 未解析的符号是
_PyInt_AsInt
问题是Python 次要次要版本之间的某些函数之间的不匹配(这不会破坏任何向后兼容性,顺便说一句)。让我详细说明:
不管Python是如何编译的,都会发生以下事情:在2.7.10和2.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 !