【问题标题】:Import local packages in python在python中导入本地包
【发布时间】:2015-10-09 00:40:58
【问题描述】:

我已经浏览了很多关于此的帖子,但似乎仍然不起作用。这笔交易相当划算。我有以下层次结构。

main.py
DirA/
    __init__.py
    hello.py
DirB/
    __init__.py
    foo.py
    bla.py
    lol.py

DirA 的__init__.py 是空的。 DirB 中的相应模块仅包含 foo 模块。

__all__.py = ["foo"]

main.py有如下代码

import DirA
import DirB

hey()        #Def written at hello.py
foolish1()   #Def written at foo.py
foolish2()   #Def written at foo.py

长话短说,我得到了 NameError: name 'foo' is not defined。有任何想法吗?提前致谢。

【问题讨论】:

    标签: python packages python-import


    【解决方案1】:

    你只会得到你导入的东西。因此,在你的主目录中,你只会得到DirADirB。您可以通过以下方式之一使用它们:

    import DirA
    DirA.something_in_init_py()
    
    # Importing hello:
    import DirA.hello
    DirA.hello.something_in_hello_py()
    
    # Using a named import:
    from DirA.hello import something_in_hello_py
    something_in_hello_py()
    

    DirB 中,只需将__init__.py 也设为空即可。 __all__ 的唯一用途是当您想要导入 * 时,这是您不想要的,因为正如他们所说,显式优于隐式

    但如果你好奇,它会这样工作:

    from DirB import *
    something_in_dirb()
    

    默认情况下,import * 将导入它可以找到的不以下划线开头的所有内容。指定__all__ 会将其导入的内容限制为__all__ 中定义的名称。见this question for more details

    编辑:关于初始化。

    __init__.py 并没有真正连接到导入的东西。它只是一个具有以下属性的特殊文件:

    • 它的存在意味着该目录是一个python包,里面有几个模块。如果不存在,python 将拒绝从该目录导入任何内容。
    • 它总是在加载目录中的任何其他内容之前加载。
    • 其内容将作为包本身提供。

    试试把这个放到DirA/__init__.py:

    foo = 42
    

    现在,在你的主要:

    from DirA import foo
    print(foo)  # 42
    

    它很有用,因为您可以在__init__.py 中导入一些子模块来隐藏包的内部结构。假设您构建了一个包含 Author、Book 和 Review 类的应用程序。为了使其更易于阅读,您在包中为每个类提供了自己的文件。现在在您的主目录中,您必须导入完整路径:

    from myapp.author import Author
    from myapp.book import Book
    from myapp.review import Review
    

    显然不是最优的。现在假设您将上面这些确切的行放在您的__init__.py 中,您可以像这样简化您的主要内容:

    from myapp import Author, Book, Review
    

    Python 将加载__init__.py,这将依次加载所有子模块并导入类,使它们在包中可用。现在你的 main 不需要知道类的实际实现位置。

    【讨论】:

    • 第三个选项似乎更符合我的风格:P 工作正常,只是几个问题。为什么不导入 * 并明确命名每个定义?而且,当您想要导入 * 时,init.py 会发生什么?谢谢
    • 添加了一些关于__init__.py使用的提示,如果有帮助请告诉我。
    • Billy Grande:使用import * 相当于挖鼻孔的编码。当你私下这样做时,它不会打扰你,但当别人这样做时,你会觉得很恶心。
    • @spectras - “编辑:关于 init” 是这个回复真正有用的地方。谢谢。
    【解决方案2】:

    你有没有尝试过这样的事情: 一种方式

    from DirA import hello
    

    另一种方式

    from DirA.hello import hey 
    

    如果这些不起作用,则附加一个新的系统路径

    【讨论】:

      【解决方案3】:

      你需要自己导入函数:

      How to call a function from another file in Python?

      在你的情况下:

       from DirA import foolish1, foolish2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        • 1970-01-01
        • 2015-09-02
        相关资源
        最近更新 更多