我已经完成了很多关于此的帖子,但似乎仍然没有用。这笔交易相当减少。我有以下层次结构。
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'没有定义。有任何想法吗?提前谢谢。
答案 0 :(得分:2)
您只能获得导入的内容。因此,在您的主要内容中,您只能获得DirA
和DirB
。您可以通过以下方式之一使用它们:
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
并未真正与导入内容相关联。它只是一个具有以下属性的特殊文件:
试试把它放在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