【问题标题】:__init__.so (instead of __init__.py) masks subpackages__init__.so(而不是 __init__.py)屏蔽子包
【发布时间】:2011-11-09 04:57:59
【问题描述】:

我正在用 cython 编写一些代码,并且我有一些 "Packages “within” modules"。 ——这实际上是我的问题的后续,结构应该是一样的。问题是这是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 的错误。这不是一个解决方案,但我想知道它是否是问题的根源。

【问题讨论】:

    标签: python module python-3.x package cython


    【解决方案1】:

    让您的 Cython 代码位于与 __init__.py 不同的文件中,并将其导入普通 python __init__.py 请参阅我对您上一个问题的回答。

    【讨论】:

    • 我曾想过把它放在一个单独的文件中,然后从__init__.py 导入它,但我担心我的包会被两个可以导入来做同样事情的模块污染。我想过在“真实”模块的名称中添加一个. 以阻止它被导入,但这当然也会阻止它从__init__.py 导入!然后,我陷入了寻找复杂解决方案的困境,以至于我没有想到只是强调它。也许一个简单的解决方案是最好的。谢谢。
    【解决方案2】:

    对于给定问题,最简单的解决方案可能是将您的__init__.so 模块重命名为_native.so 之类的名称。之后您可以创建__init__.py,其中包含以下行:

    from _native import *
    

    它应该像你描述的那样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2016-09-05
      • 2017-07-25
      • 2020-06-07
      • 2014-08-04
      • 1970-01-01
      相关资源
      最近更新 更多