[英]Import local packages in python
我已經瀏覽過很多關於此的文章,但似乎仍然沒有用。 這筆交易很划算。 我有以下層次結構。
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'。 有任何想法嗎? 提前致謝。
您只會得到導入的內容。 因此,在您的main中,您只會得到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__
的唯一用途是在您要導入*
,您不希望這樣做,因為正如他們所說, 顯式要比隱式好 。
但是如果您好奇的話,可以這樣操作:
from DirB import *
something_in_dirb()
默認情況下, import *
將導入它可以找到的所有不以下划線開頭的內容。 指定__all__
限制它導入到中定義的名稱__all__
。 有關更多詳細信息,請參見此問題 。
編輯:關於初始化。
__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
,您可以像這樣簡化main:
from myapp import Author, Book, Review
Python將加載__init__.py
,這將依次加載所有子模塊並導入類,從而使它們在包中可用。 現在您的主要人員不需要知道類的實際實現位置。
您是否嘗試過以下方法:一種方法
from DirA import hello
其他方式
from DirA.hello import hey
如果這些方法無效,請附加新的系統路徑
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.