在Python中导入包

在Python中导入包,python,python-import,Python,Python Import,情景: dirA/ __init__.py file1.py file2.py dirB/ __init__.py file11.py file22.py dirC/ __init__.py file111.py file222.py 我读到的是相反的,当使用像import item.subitem.subsubsubitem这样的语法时,除了最后一

情景:

dirA/
   __init__.py
   file1.py
   file2.py
   dirB/
       __init__.py
       file11.py
       file22.py
       dirC/
           __init__.py
           file111.py
           file222.py
我读到的是相反的,当使用像import item.subitem.subsubsubitem这样的语法时,除了最后一个之外的每个项目都必须是一个包;最后一项可以是模块或包,但不能是前一项中定义的类、函数或变量。

现在,由于上述阅读,我有一个疑问:

  • 当我写import dirA.dirB时,那么这个语句是也导入dirC包中的模块,还是只导入dirB中的模块

  • 导入dirA.dirB有什么用,因为在使用此语句时,我仍然无法使用dirB子包中的模块


  • 我知道要使用dirB中的模块,我必须使用导入dirA.dirB.file11

    当您使用dirA导入dirB中的
    时,
    dirB
    将是一个包含
    dirB/\uu init\uuuuu.py
    中定义或导入的任何内容(变量、函数等)的模块

    这通常用于使
    dirB
    的“公共”组件易于访问。例如,您可能有:

    from .file11 import Foo
    from .file22 import Bar
    
    这样,您的库的用户就可以简单地调用:

    from dirA.dirB import Foo, Bar
    

    当您导入dirA.dirB
    时,不必记住哪个文件定义了
    Foo
    Bar

    ,您只需导入包
    dirB
    ,这意味着您基本上导入了
    dirB.py
    下的
    \uu init\uuuuuuuuuupy
    ,如果
    \uuuu init\uuuuu.py
    正在定义一些函数或类等,那么您可以在导入
    dirA.dirB
    后使用它们

    范例-

    我的目录结构-

    共享/ a、 派克 包装/ init.py b、 派克

    现在在
    pkg/\uuuu init\uuuu.py
    中,我有-

    x = 1
    import pkg.b
    
    我的
    pkg/b.py
    是-

    a = 1
    
    现在在
    a.py
    中,我可以-

    import pkg
    print(pkg.b.a)
    print(pkg.x)
    

    这是可行的,因为
    \uuuu init\uuuuuuuuuupy
    导入了
    pkg.b
    ,因此可以使用
    pkg.b.a

    访问它,如果pkg/\uuuuu init\uuuuuuuuuupy中没有写入任何内容,那么在a.py中写入import pkg时会将哪些内容加载到内存中?什么都没有。只有
    pkg
    的模块对象,但您将无法对其执行任何操作。好的,这是否意味着只有在init.py中编写了代码时,导入子包才有意义?不,您可以简单地导入子包,如
    import pkg.b
    直接在
    a.py
    中导入。但是要将
    pkg
    识别为一个包,您需要
    pkg
    文件夹中的
    \uuuu init\uuuuuuuuuy.py
    。导入pkg.b将加载模块b,这不是问题所在。我对子包有意见,我的意思是包中肯定会有一个init.py文件,但是如果我们没有在这个文件中写任何东西,并且只导入这个包,比如导入packagename,那么它就没有任何意义,因为我们没有在init.py文件中写任何东西。谢谢David Wollever。