2015-11-10 39 views
0

我已經構建了自己的Python庫,我在nr命名空間下收集了這些庫。現在,對於名爲C4D的應用程序中的Python插件,我想使用nr.c4d模塊,但無法導入。奇怪的是,如果我將它重命名爲其他任何東西(例如nr.c4dlib),它就可以工作!無法導入名稱空間包「c4d」,但它的任何其他名稱都可以使用

+ nr.c4d\ 
    + nr\ 
    * __init__.py # < pkgutil.extend_path() in here 
    + c4d\ 
     * __init__.py 
     * gui.py 
     * ... 

這是在每個命名空間__init__.py

# This is a namespace package. 
try: 
    import pkg_resources 
    pkg_resources.declare_namespace(__name__) 
except ImportError: 
    import pkgutil 
    __path__ = pkgutil.extend_path(__path__, __name__) 

nr.__path__名單似乎罰款的代碼了。

['C:\\maxon\\Cinema 4D R16 Dev\\plugins\\procedural\\python\\nr', 
'C:\\maxon\\Cinema 4D R16 Dev\\plugins\\cloudui_frontend_r16\\devel\\nr.strex\\nr', 
'C:\\maxon\\Cinema 4D R16 Dev\\plugins\\cloudui_frontend_r16\\devel\\nr.concurrency\\nr', 
'C:\\maxon\\Cinema 4D R16 Dev\\plugins\\cloudui_frontend_r16\\devel\\nr.cli\\nr', 
'C:\\maxon\\Cinema 4D R16 Dev\\plugins\\cloudui_frontend_r16\\devel\\nr.c4d\\nr'] 

,但我得到

Traceback (most recent call last): 
    File "'cloudui_frontend.pyp'", line 176, in <module> 
ImportError: No module named c4d 

這可能是相關的,有環境稱爲c4d內置模塊。這個錯誤的來源是什麼?如何解決它?


更新這個問題似乎來自名爲nr.procedural另一個命名空間模塊。它在文件的頂部有import c4d。如果該行被註釋掉,則導入nr.c4d作品!另外,我可以添加from __future__ import absolute_import來代替註釋。

回答

0

相對導入引起要在sys.modulesnr.c4d創建None -entry之前nr.__path__延長的第二時間。這是我對我的localimport庫打開問題:

方案nr.procedural確實import c4d。如果nr.c4d不存在,該模塊將作爲無條目添加到sys.modules。如果_localimport用於導入nr.c4d,則將不會找到該模塊,因爲模塊高速緩存指出該模塊不存在(由無條目)。

解決方案_localimport必須刪除__enter__()上的名稱空間包的無條目。

fix是相對容易的。

我需要將from __future__ import absolute_import添加到所有nr.子包,但import c4d