__init__.so(而非__init__.py)遮盖子包

5 投票
2 回答
954 浏览
提问于 2025-04-17 05:53

我在写一些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 *

这样应该就能按照你说的那样正常工作了。

撰写回答