Python 导入文件夹

1 投票
4 回答
2745 浏览
提问于 2025-04-17 02:46

我正在使用Python 2.6。对于Python编程我还是个新手,所以请多包涵。我有多个文件夹,每个文件夹里都有多个包。我的文件夹结构是这样的:

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

我需要能够导入这两个LLE文件夹才能让程序正常工作。我不能把disconfig或common添加到PYTHONPATH,因为它们都有一个LLE文件夹。当我执行import 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文件的导入,还有“import DIS”和“import Data”。然后在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/Data的一部分)。如果我把它们分开,就会出现导入错误。

更多编辑: 我把所有的.py文件添加到了/MDIS目录下的init.py中,并从子目录的init.py中删除了它们。现在我只用“import 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转换器的问题。他们正在帮助我解决这个问题。谢谢大家的帮助!

4 个回答

1

这个方法可以用:

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

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

1

你需要在 disconfig/__init__.py 文件里加一句 import LLE,这样之后再用 import disconfig.LLE 就可以正常使用了。

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()

我真的觉得我提的建议是有效的,但我无法解释原因。如果有人能用简单易懂的话解释一下,我相信提问的人会很高兴。这个内容在 http://docs.python.org/tutorial/modules.html#packages 有说明,但我不确定那里的解释是否够简单。

撰写回答