在python中导入本地包

Import local packages in python

我已经浏览了很多关于这个的帖子,但仍然不起作用。这笔交易相当少。我有以下等级。

1
2
3
4
5
6
7
8
9
main.py
DirA/
    __init__.py
    hello.py
DirB/
    __init__.py
    foo.py
    bla.py
    lol.py

迪拉的"初始"是空的。DIRB的相应模块只包含foo模块。

1
__all__.py = ["foo"]

main.py有以下代码

1
2
3
4
5
6
import DirA
import DirB

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

长话短说,我得到了名称错误:没有定义名称"foo"。有什么想法吗?事先谢谢。


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

1
2
3
4
5
6
7
8
9
10
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__的唯一用途是当你想导入*时,你不想这样做,因为正如他们所说,显式比隐式好。

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

1
2
from DirB import *
something_in_dirb()

默认情况下,import *将导入它可以找到的所有内容,这些内容不以下划线开头。指定__all__将限制导入到__all__中定义的名称中的内容。有关详细信息,请参阅此问题。

编辑:关于初始化。

__init__.py与进口产品没有真正的联系。它只是一个具有以下属性的特殊文件:

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

试着把这个放在DirA/__init__.py里:

1
foo = 42

现在,你的主要观点是:

1
2
from DirA import foo
print(foo)  # 42

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

1
2
3
from myapp.author import Author
from myapp.book import Book
from myapp.review import Review

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

1
from myapp import Author, Book, Review

python将加载__init__.py,然后加载所有子模块并导入类,使它们在包中可用。现在,您的主体不需要知道类实际上是在哪里实现的。


你试过这样的方法吗?单向

1
from DirA import hello

另一种方式

1
from DirA.hello import hey

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


您需要导入函数本身:

如何从Python中的另一个文件调用函数?

在您的情况下:

1
 from DirA import foolish1, foolish2