簡體   English   中英

用python導入本地包

[英]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中,您只會得到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__ 有關更多詳細信息,請參見此問題

編輯:關於初始化。

__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 ,您可以像這樣簡化main:

from myapp import Author, Book, Review

Python將加載__init__.py ,這將依次加載所有子模塊並導入類,從而使它們在包中可用。 現在您的主要人員不需要知道類的實際實現位置。

您是否嘗試過以下方法:一種方法

from DirA import hello

其他方式

from DirA.hello import hey 

如果這些方法無效,請附加新的系統路徑

您需要導入函數本身:

如何在Python中從另一個文件調用函數?

在您的情況下:

 from DirA import foolish1, foolish2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM