2011-09-21 183 views
1

我正在使用Python 2.6。我是Python編程的新手,所以請原諒我的無知。我有多個包的多個目錄。我的目錄結構如下所示:Python導入文件夾

/disconfig 
    __init__.py 
    /LLE 
     __init__.py 
     /DIS 
      __init__.py 
     /Data 
      __init__.py 
/common 
    __init__.py 
    /LLE 
     __init__.py 

我需要能夠導入兩個LLE目錄才能使程序正常工作。我無法在PYTHONPATH中添加disconfig或common,因爲它們都有一個LLE目錄。當我導入LLE時,它只吸引其中一個。我試着這樣做:

import disconfig.LLE 

它錯誤說:

Traceback (most recent call last): 
    File "./disconfig.py", line 9, in <module> 
    import disconfig.LLE 
    File "./disconfig.py", line 9, in <module> 
    import disconfig.LLE 
ImportError: No module named LLE 

我已經試過:

import disconfig 

這個工作,但是當我嘗試從一箇中運行代碼模塊:

LLE.DIS.runDisFunc 

它回來說

name 'LLE' not defined 

如果我嘗試:

disconfig.LLE.DIS.runDisFunc 

它說有錯誤:

'module' object has no attribute 'LLE' 

我已經工作了這麼久,不能環繞它我的大腦。有什麼建議麼?

編輯: 也許還有一件事要提。這些目錄中的文件由ZeroC的slice2py生成。他們將所有生成的.py文件放在頂層目錄中(所以在/ disconfig下)。 LLE目錄中有init .py,其中包含所有生成的.py文件以及「導入DIS」和「導入數據」的導入。然後在DIS和Data中,有init .py文件,其中包含特定於這些模塊的導入。因此,更徹底,它看起來像:

/disconfig 
    __init__.py 
    Attribute_ice.py 
    DIS_ice.py 
    DISControl_ice.py 
    /LLE 
     __init__.py 
     /DIS 
      __init__.py 
     /Data 
      __init__.py 

如果我改變從disconfig到MDIS(的建議)模塊,並做

import MDIS 

我得到

Traceback (most recent call last): 
    File "./disconfig", line 9, in <module> 
    import MDIS 
    File "/oudvmt/python/MDIS/__init__.py", line 18, in <module> 
    import LLE 
    File "/oudvmt/python/MDIS/LLE/__init__.py", line 4, in <module> 
    import Attribute_ice 
ImportError: No module named Attribute_ice 

如果我嘗試

import MDIS.LLE 

我得到

Traceback (most recent call last): 
    File "./disconfig", line 9, in <module> 
    import MDIS.LLE 
    File "/oudvmt/python/MDIS/__init__.py", line 18, in <module> 
    import LLE 
    File "/oudvmt/python/MDIS/LLE/__init__.py", line 4, in <module> 
    import Attribute_ice 
ImportError: No module named Attribute_ice 

我已經試過產生.py文件移動到子目錄,但導致其他的問題,因爲在/ DIS文件依賴於文件/數據(DIS_ice.py進口Attribute_ice.py,這是LLE/Data的一部分)。如果我將它們分開,我會得到ImportErrors。

更多編輯: 我加了所有的。py文件複製到我的init .py,並將其從子目錄中的init .py中刪除。現在,我只使用「導入MDIS」導致了更多的導入錯誤。但是,現在當我嘗試我的功能

disadmin = MDIS.LLE.DIS.DISAdminPrx.checkedCast() 

我得到

'module' object has no attribute 'DISAdminPrx' 

在DISAdmin_ice.py,有一個叫DISAdminPrx類,它確實有checkedCast時的方法。我試圖

disadmin = DISAdmin_ice.DISAdminPrx.checkedCast() 

disadmin = MDIS.LLE.DIS.DISAdmin_ice.DISAdminPrx.checkedCast() 

和任何其他組合我能想到的。

再次編輯 看起來這是我從ZeroC使用的python轉換器的問題。他們正在幫我解決它。謝謝您的幫助!

+0

運行'import disconfig'後,dir(disconfig)'的輸出是什麼? –

+0

['Ice','__builtins__','__doc__','__file__','__name__','__package__','cgi','cgitb','disconfig','escape','os','sys', 'traceback'] –

回答

2

看起來您的腳本被命名爲disconfig.py,所以當您調用腳本時,您需要調用腳本import disconfig。您應該將您的腳本命名爲與您的模塊不同。

編輯

disadmin = MDIS.LLE.DIS.DISAdmin_ice.DISAdminPrx.checkedCast() 

你應該做的

import MDIS.LLE.DIS.DISAdmin_ice 

或做

from MDIS.LLE.DIS.DISAdmin_ice import DISAdminPrx 
DISAdminPrx.checkedCast() 

我真的覺得什麼我提議工作,但我無法解釋爲什麼如果有人能夠用綜合的話來解釋爲什麼我確信OP會很高興。這是在http://docs.python.org/tutorial/modules.html#packages解釋,但我不確定這是簡單的話。

+0

好吧,我將模塊更改爲MDIS,但它仍然無法工作。 dir(MDIS)出現爲:['__builtins__','__doc__','__file__','__name__','__package__','__path__'] –

+0

您確定'import MDIS.LLE' does not work? –

+0

是的,它沒有工作。它仍然給我一個ImportError。 –

1

您需要import LLE聲明disconfig/__init__.py,然後import disconfig.LLE應該工作。

1

這將工作:

import disconfig.LLE.DIS 
disconfig.LLE.DIS.runDisFunc() 

這是因爲Python不會自動導入子包。