__init__.so(而非__init__.py)遮盖子包
我在写一些Cython代码,遇到了一些关于模块内部的“包”的问题。——这是我在那里的问题的后续,结构应该是一样的。问题是因为这是Cython,所以我处理的是.so
文件,而不是.py
文件。
有了__init__.so
,可以在一定程度上工作,
import mystuff
这样是可以的,但似乎会遮盖下面所有的子包。也就是说,
import mystuff.test.test1
这样就不行了。我收到一个ImportError: No module named ...
的错误。
我该如何解决这个问题呢?我需要在编译.c
之前在.pyx
中添加什么吗?或者我可以把__init__.so
重命名为其他名字,然后把它引入到__init__.py
中吗?(注意,__init__.py
仍然需要和.so
一起存在,以表明这是一个包)?或者还有其他的办法。
更新:__path__
属性在.so
包中未定义...
好吧,我想到一个办法,也许可以通过操作包的__path__
属性来解决这个问题。有趣的是,这个属性在.py
包中是定义的,但在.so
中会导致错误。这不是解决方案,但我想知道这是否是问题的根源。
2 个回答
2
把你的Cython代码放在一个和__init__.py
不一样的文件里,然后在普通的Python的__init__.py
中导入它。你可以看看我之前对你问题的回答。
2
解决这个问题最简单的方法可能就是把你的 __init__.so
模块改个名字,比如叫 _native.so
。然后你可以创建一个 __init__.py
文件,里面写上以下这一行:
from _native import *
这样应该就能按照你说的那样正常工作了。