Python导入文件夹

时间:2011-09-21 16:28:13

标签: python import

我使用的是Python 2.6。我是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文件的导入以及&#34;导入DIS&#34;和&#34;导入数据&#34;。然后在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中的文件依赖于/ Data中的文件(DIS_ice.py导入Attribute_ice.py,这是其中的一部分) LLE /数据)。如果我将它们分开,我会得到ImportErrors。

更多编辑: 我将所有.py文件添加到/ MDIS目录中的 init .py,并从子目录中的 init .py中删除它们。现在我只使用&#34;导入MDIS&#34;而没有更多的导入错误。但是,现在当我尝试我的功能时

 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转换器存在问题。他们正在帮助我解决它。谢谢你的帮助!

3 个答案:

答案 0 :(得分: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中有解释,但我不确定是用简单的词语。

答案 1 :(得分:1)

您需要在import LLE中使用disconfig/__init__.py语句,然后import disconfig.LLE才能生效。

答案 2 :(得分:1)

这将有效:

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

这是因为Python不会自动导入子包。