2

我有一个依赖于 C 库的 Python 库,所以我使用 Cython 来处理它。虽然我设法包装了库并准备好安装,但我遇到了一个奇怪的问题(注意:为了非广告,我没有使用库的名称)。

我有以下目录结构:

package/
       setup.py
       library/
              __init__.py
              module/
                    lib.py
                    _lib.pyx

setup.py应该转换_lib.pyx为,_lib.so可以很容易地被 Python 导入。此外,library.module应该作为命名空间包安装,因此lib.__init__.py包含 PEP420 所需的单行代码。

__import__('pkg_resources').declare_namespace(__name__)

但是当我这样做时:

python setup.py install

在检查.egg创建后,我发现一个_lib.pycreated 里面module有以下几行

def __bootstrap__():
   global __bootstrap__, __loader__, __file__
   import sys, pkg_resources, imp
   __file__ = pkg_resources.resource_filename(__name__,'_lib.so')
   __loader__ = None; del __bootstrap__, __loader__
   imp.load_dynamic(__name__,__file__)
__bootstrap__()

虽然_lib.py与 一起存在,但_lib.so只要lib.pyimports _lib,它就会导入 _lib.py 文件,而不是导入_lib.soC 库的实际 Python 包装器。

我想知道为什么_lib.py要创建以及如何避免它。

4

1 回答 1

1

现在很明显,创建的与文件同名的奇怪.so文件没有造成任何问题。.so事实上,这是与模块更紧密集成所必需的。因此,它是在安装文件时自动创建的。

于 2015-07-03T09:59:49.970 回答