我有一个依赖于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.py
内创建了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.py
导入_lib
,它就会导入_lib.py文件而不是导入_lib.so
是C库的实际Python包装器。
我想知道为什么要创建_lib.py
以及如何避免它。
答案 0 :(得分:0)
现在很清楚,使用与.so
文件同名创建的 strange 文件不会产生任何问题。事实上,与.so
模块更紧密地集成是必要的。因此,它会在安装文件时自动创建。