[英]Python custom module and import
我下面這個關於如何打包Python模塊的例子。 但是當我嘗試使用它時,使用 pip 安裝我構建的包,而以下工作。
from towel_stuff import towel_utils
x = towel_utils.has_towel()
print(x)
這也有效,
import towel_stuff.towel_utils
x = towel_stuff.towel_utils.has_towel()
print(x)
我不明白,為什么以下不起作用。
import towel_stuff
x = towel_stuff.towel_utils.has_towel()
print(x)
通常情況下,比如我們想使用os.path
,我們不需要寫import os.path
,只要import os
就可以了。 那么,對於我構建的包,為什么我必須提供完整的包路徑?
當然,我可以使用from towel_stuff import *
來導入所有內容,但是很好奇為什么我們不需要提供標准包的完整路徑。
鑒於以下結構:
towel_stuff
----__init__.py
----towel_utils
當您使用import towel_stuff
,執行的唯一文件是__init__.py
,因此如果您沒有在__init__.py
導入towel_utils
,則根本無法訪問它。
簡而言之,當您使用import a_module
,您只是在執行該模塊目錄中的__init__.py
文件。 如果要訪問a_module.file
,則需要顯式導入它。
當您使用import a_file
,您正在執行該文件,因為path
只是os
一個變量,因此您可以像os.path
一樣訪問它。
所以,不同的是, path
是在一個變量os
,而towel_utils
是一個子模塊towel_stuff
。 或者讓我們說path
是os
一個導入模塊,這使它成為一個變量。
一般情況下,比如我們要使用os.path,不需要寫import os.path,只需要import os就可以了。 那么,對於我構建的包,為什么我必須提供完整的包路徑?
這完全取決於模塊的構造方式。 例如,如果在您的towel_stuff
模塊中包含:
from towel_stuff import towel_utils
然后只導入towel_stuff
代碼可以訪問towel_stuff.towel_utils
而不需要額外的導入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.