【问题标题】:python : imported packages with 'nested' modulespython:带有“嵌套”模块的导入包
【发布时间】:2020-10-13 02:26:18
【问题描述】:

当我导入模块时,这个嵌套场景可以正常工作。但是当我尝试导入包时,我得到了不一致的结果。这是一个非常简单的案例:

我当前文件夹的内容:

mypackages <directory>
   __init__.py 
   one.py
   two.py
   three.py

这是脚本:

__init__.py :
import one

one.py :
import two

two.py :
import three

我希望我应该能够以这种方式访问​​两个三个

import mypackages
mypackages.one.two
mypackages.one.two.three

或者换句话说,逻辑级别应该是这样的:

one
  two
    three

但是当我执行 import mypackages 时,我将所有模块都暴露在同一级别:

>>> import mypackages
>>> print dir(mypackages)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 
'__path__', 'one', 'three', 'two']

它应该只显示 one 模块,对吗? 我很困惑为什么它显示所有 one , twothree 这意味着它们处于同一级别(我可以直接使用 mypackages.twomypackages.three ) .

有人解释一下吗?

【问题讨论】:

    标签: python import module nested package


    【解决方案1】:

    您应该阅读this

    通过将文件放在同一级别,您将它们放在同一包级别。 在你的情况下,你需要得到这个架构:

    mypackage
    ├── __init__.py
    ├── one.py  # contains "import two"
    └── two
        ├── __init__.py
        ├── two.py  # contains "import three"
        └── three
            ├── __init__.py
            └── three.py
    

    然后,您可以通过以下方式访问包:

    import mypackage.one
    import mypackage.one.two
    import mypackage.one.two.three
    

    【讨论】:

    • 想扩展它以涵盖子包中函数和类的使用吗?
    • 你的意思是,如何访问模块对象的成员?
    • 是的。我尝试了建议的解决方案,但无法使其工作。在一个目录中,我有一个文件夹 intl,其中包含一个文件 (scanner.py),并希望将其变成一个包。在主文件中,执行import intlscanner = intl.Scanner() 不起作用。我不得不修改__init__.py 并在其中添加from .scanner import Scanner ...因此,使用包/子包中的函数和类的用例会改进这个答案,因为它没有提到任何关于修改@987654330 @。虽然我设法让我的脚本工作,但我不知道我是否采取了正确的方法:)
    猜你喜欢
    • 2011-01-12
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2016-09-06
    • 2020-01-06
    • 2017-03-12
    相关资源
    最近更新 更多