导入.so时导入语句的顺序是否重要?

bal*_*lki 6 c++ python import shared-libraries boost-python

尝试加载使用boost python编译的python模块时,我收到以下导入错误.

ImportError: /path/to/library/libxml2.so.2: symbol gzopen64, version ZLIB_1.2.3.3 not defined in file libz.so.1 with link time reference
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果这是要导入的非标准模块,我不会看到此错误.即如果我导入其他模块然后导入此模块,则导致导入错误失败.不确定出现了什么问题或如何调试.

编辑:要准确显示问题:

$ python -c 'import json, libMYBOOST_PY_LIB' # DOES NOT WORK!!!
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: path/to/xml_library/libxml2.so: symbol gzopen64, version ZLIB_1.2.3.3 not defined in file libz.so.1 with link time reference
$ python -c 'import libMYBOOST_PY_LIB, json' # WORKS NOW!!!
$
Run Code Online (Sandbox Code Playgroud)

它不仅仅是json,在我的模块之前导入时,很少有其他模块也会导致同样的问题.例如.的urllib2

dno*_*zay 5

import陈述的顺序很重要.

如python语言参考中所述:

一旦知道模块的名称(除非另有说明,术语"模块"将指代包和模块),搜索模块或包可以开始.检查的第一个位置是sys.modules先前导入的所有模块的缓存.如果在那里找到该模块,则在导入的步骤(2)中使用它.

任何模块都可以改变:

他们也可以改变导入钩子:

导入挂钩可以让您从zip文件,任何类型的存档文件,网络等加载模块.


import libMYBOOST_PY_LIB
Run Code Online (Sandbox Code Playgroud)

这个语句sys.modules肯定会修改,将其依赖项加载到模块缓存中.它也可以修改sys.path.它实际上是框架很常见(如boost,zope,django,requests...)用附送的电池出货/与它们所依赖的组件的副本.

  • django 船舶 json
  • requests 船舶 urllib3

要准确查看库将加载的内容,您可以使用:

python -v -c 'import libMYBOOST_PY_LIB'
Run Code Online (Sandbox Code Playgroud)