在python中导入本地包

时间:2015-10-08 16:01:49

标签: python packages python-import

我已经完成了很多关于此的帖子,但似乎仍然没有用。这笔交易相当减少。我有以下层次结构。

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:名字'foo'没有定义。有任何想法吗?提前谢谢。

3 个答案:

答案 0 :(得分:2)

您只能获得导入的内容。因此,在您的主要内容中,您只能获得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__的唯一用途是当您要导入*时,您不想要,因为正如他们所说,显式优于隐式。< / p>

但是如果你很好奇,那就会这样:

from DirB import *
something_in_dirb()

默认情况下,import *会导入无法以下划线开头的所有内容。指定__all__会将其导入的内容限制为__all__中定义的名称。请参阅this question for more details

编辑:关于init。

__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,它将加载所有子模块并导入类,使它们在包上可用。现在你的主要人员不需要知道实际实现类的位置。

答案 1 :(得分:1)

你试过这样的事吗: 一种方式

from DirA import hello

另一种方式

from DirA.hello import hey 

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

答案 2 :(得分:0)

您需要导入函数本身:

How to call a function from another file in Python?

在你的情况下:

 from DirA import foolish1, foolish2