2011-11-08 46 views
4

我正在寫一些代碼在cython中,並且我有一些"Packages 「within」 modules"。 —這實際上是跟隨我的問題,結構應該是相同的。問題是,這是cython,所以我正在處理.so的不是.py的。__init__.so(而不是__init__.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

將您的Cython代碼放在​​與__init__.py不同的文件中,並將其導入普通python __init__.py請參閱我對上一個問題的回答。

+0

我曾想過把它放在一個單獨的文件中,並從'__init __。py'中導入它,但是擔心會導致兩個模塊被污染,導致我可以執行相同的操作。我想在「真實」模塊的名稱中放一個'.'來阻止它被導入,但是當然這會阻止它從'__init __。py'中導入!然後我陷入困境,尋找複雜的解決方案,它並沒有跨越我的想法,只是強調了它。也許簡單的解決方案是最好的。謝謝。 – tjm

2

對於給定的問題,最簡單的解決方案可能是將__init__.so模塊重命名爲_native.so。之後,您可以創建__init__.py這將包含以下行:

from _native import * 

而且你描述它應該工作。