Python导入折叠

2024-06-16 10:11:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python2.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目录。当我导入LLE时,它只会吸引其中一个。我试过:

^{pr2}$

说错了:

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'

我已经做了这么长时间了,一直没法思考。有什么建议吗?在

编辑: 也许还有一件事要提。这些目录中的文件是由zerocslice2py生成的。它们将所有生成的.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)中的文件_冰.py导入属性_冰.py,这是LLE/Data的一部分)。如果我把它们分开,我就会得到进口货。在

更多编辑: 我将所有的.py文件添加到/MDIS目录下的init.py中,并将它们从子目录中的init中删除。现在我有更多的导入错误使用“导入MDI”。但是,现在当我尝试我的函数时

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

我明白了

'module' object has no attribute 'DISAdminPrx'

在DISAdmin中_冰.py,有一个名为disadminrx的类,它确实有一个checkedCast方法。我试过了

disadmin = DISAdmin_ice.DISAdminPrx.checkedCast()

以及

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

以及我能想到的任何其他组合。在

再次编辑 看来这是我从ZeroC使用的python转换器有问题。他们正在帮我解决这个问题。谢谢你的帮助!在


Tags: 文件inpyimport目录datainitline
3条回答

您需要disconfig/__init__.py中的import LLE语句,然后import disconfig.LLE应该可以工作。在

这将起作用:

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

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

您的脚本似乎命名为disconfig.py,因此当您import disconfig时,您将调用该脚本。您应该以不同于模块的名称命名脚本。在

编辑

以前

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

你应该这么做

^{pr2}$

或者做

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

我真的认为我的提议是可行的,但我无法解释为什么如果有人能用全面的话解释为什么,我相信运营商会很高兴的。它是在http://docs.python.org/tutorial/modules.html#packages中解释的,但我不确定这是用简单的语言。在

相关问题 更多 >