2011-09-21 139 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不会自动导入子包。