Python中導入模塊的幾種方式總結
Part.I 預備知識
Chap.I 幾個概念的區(qū)分
- Python 模塊(Module),是一個 Python 文件,以 .py 結尾,包含了 Python 對象定義和 Python 語句。
- Python 包是一個分層次的文件目錄結構,它定義了一個由模塊及子包,和子包下的子包等組成的 Python 的應用環(huán)境。簡單來說,包就是文件夾,但該文件夾下必須存在 __init__.py 文件, 該文件的內(nèi)容可以為空。__init__.py 用于標識當前文件夾是一個包。
- 文件夾:文件夾就是不存在 __init__.py 文件的文件夾。
Chap.II 模塊中的 all 變量
__all__ 是針對模塊公開接口的一種約定,以提供了“白名單”的形式暴露接口。如果定義了__all__,其他文件中使用from xxx import *導入該文件時,只會導入 __all__ 列出的成員,可以其他成員都被排除在外。
定義 all 需要注意的地方
- __all__ 的形式都是 list類型。如果寫成其他類型, pyflakes 等 lint 工具可能無法識別。
- 不能動態(tài)生成 __all__,如使用列表解析式。__all__ 的作用是定義公開接口,需要以字面量的形式顯式寫出來。
- 即使定義了 __all__, 也不應該在非臨時代碼中使用 from xxx import * 語法,或用編程工具模擬 Ruby 的自動 import。Python 不像 Ruby,沒有 Module 這類成員,模塊就是命名空間隔離的執(zhí)行者。如果打破了這一層,引入諸多動態(tài)因素,生產(chǎn)環(huán)境中跑的代碼就可能充滿不確定性,調試也會變得困難。
- 按照 PEP8 建議的風格,__all__ 應該寫在所有 import 語句下面,函數(shù)、常量等成員定義的上面。
- 如果一個模塊需要暴露的接口改動頻繁,__all__ 可以這樣定義,這樣修改一個暴露的接口只修改一行,方便版本控制的時候看 diff。最后多出的逗號在 Python 中是允許的,符合 PEP8 風格。
__all__ = [ "foo", "bar", "egg", ]
Part.II 導入模塊的幾種方法
Chap.I 方法
Python 導入模塊一般用到兩種方法:
import model1from model import xxx
當我們向文件導入某個模塊時,導入的是該模塊中那些名稱不以下劃線(單下劃線_或者雙下劃線__)開頭的變量、函數(shù)和類。因此,如果我們不想模塊文件中的某個成員被引入到其它文件中使用,可以在其名稱前添加下劃線。
除此之外,還可以借助模塊提供的 __all__ 變量,該變量的值是一個列表,存儲的是當前模塊中一些成員(變量、函數(shù)或者類)的名稱。通過在模塊文件中設置 __all__ 變量,當其它文件以from 模塊名 import *的形式導入該模塊時,該文件中只能使用 __all__ 列表中指定的成員。
也就是說,當使用
from 模塊名 import *方法導入模塊的時候,不會導入下劃線_函數(shù);另外,如果模塊中有__all__,則導入的函數(shù)還要受到__all__的控制;當使用import 模塊名導入函數(shù)時,則不會受到上面兩個的限制。
所以,以后在確定某些函數(shù)不想被訪問到,就用下劃線_或者用__all__,并使用from 模塊名 import *方法導入模塊;當想要使用模塊中的所有函數(shù)時,則使用import 模塊名來導入模塊。
Chap.II 實例
比如現(xiàn)在有個文件叫b.py
# ------------ b.py 內(nèi)容 ----------------------
__all__ = [
'b_hello',
'_b_hello'
]
def b_hello():
print("B_HELLO")
def _b_hello():
print("B_private")
def b_world():
print("B_private_world")
現(xiàn)在使用from 模塊名 import *方法導入模塊來調用函數(shù):
from b import * b_hello() _b_hello() b_world() # ------------ return --------(當 b.py 中沒有有變量 __all__ 時) B_HELLO Error:xxxxx B_private_world # ------------ return --------(當 b.py 中有變量 __all__ 時) B_HELLO B_private Error:xxxxx
使用
__all__變量,使得原本不能被訪問到的_b_hello可以被訪問到;因為__all__中沒有包含b_world,所以使得原本能被訪問到的b_world不能被訪問到。
現(xiàn)在使用import 模塊名方法導入模塊來調用函數(shù):
import b b.b_hello() b._b_hello() b.b_world() # ------------ return -------- B_HELLO B_private B_private_world
所以,以后在確定某些函數(shù)不想被訪問到,就用下劃線_或者用__all__,并使用from 模塊名 import *方法導入模塊;當想要使用模塊中的所有函數(shù)時,則使用import 模塊名來導入模塊。
ps:當包(含有
__init__.py文件的文件夾)中含有子模塊時,可以使用.來導入。比如import lib.model1 as md,就是調用包lib中的模塊model1。
補充:python導入自己的模塊
在實際的編程生活當中,我們除了會去import已經(jīng)存在的包外,當然還會偶爾自定義一些模塊,然后來導入,,,其實一般而言,自定義的模塊也就是一系列的腳本,具體的,自己寫好了腳本,然后導入,導入的情況分為以下情況:
1.自定義模塊與所需要調用自定義模塊的文件在同一文件夾下
這時的調用就較為簡單了,直接導入即可

比如說我想要在learnpandas中導入m1.py,只需要在learnpandas腳本開頭聲明import m1.py即可
2.自定義模塊與所需要調用自定義模塊的文件不在同一文件夾下
其實這個的話,如果不怕麻煩的話可以用1中的方法,把需要導入的文件一個一個手動拖到當前文件夾中,,,當然這個方法時比較復雜的,尤其是要導入的文件較多的時候,,,,
這個時候有一個更聰明的方法
假設下圖是我們需要導入的文件目錄

在這種情況下,我們在folder中新建一個__init__.py文件,此時的folder不再是一個普通的文件夾,而是一個包 package

在這個時候,想導入哪一個文件的話就只需在文件開頭import folder.filename即可(記得要先將自定義庫路徑添加到Python的庫路徑中)
3.找到本地庫的路徑,然后將文件拷進去即可
4.手動給python添加搜索路徑,具體做法是:
在python安裝目錄的\Lib\site-packages文件夾中建立一個.pth文件,內(nèi)容為自己寫的庫絕對路徑
- - - - - - - - - - - - - - - - - -分割線- - - - - - - - - - - - - - - - - -
將自定義庫的路徑添加到Python的庫路徑中去,有如下兩種方法:
1. 動態(tài)的添加庫路徑。在程序運行過程中修改sys.path的值,添加自己的庫路徑
import sys
sys.path.append(r'your_path')
2. 在Python安裝目錄下的\Lib\site-packages文件夾中建立一個.pth文件,內(nèi)容為自己寫的庫路徑。示例如下
E:\\work\\Python\\http
E:\\work\\Python\\logging
- - - - - - - - - - - - - - - 分割線 - - - - - - - - - - - - - - - - - -
在這里說一句Python的包搜索路徑:
Python會在以下路徑中搜索它想要尋找的模塊:
1. 程序所在的文件夾
2. 標準庫的安裝路徑
3. 操作系統(tǒng)環(huán)境變量PYTHONPATH所包含的路徑
總結
到此這篇關于Python中導入模塊的幾種方式總結的文章就介紹到這了,更多相關Python導入模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python猜解網(wǎng)站數(shù)據(jù)庫管理員密碼的腳本
這篇文章主要和大家分享一個Python腳本,可以實現(xiàn)猜解網(wǎng)站數(shù)據(jù)庫管理員的密碼。文中的示例代碼講解詳細,需要的小伙伴可以參考一下2022-02-02
解決Python 異常TypeError: cannot concatenate ''str'' and ''int''
這篇文章主要介紹了解決Python 異常TypeError: cannot concatenate 'str' and 'int' objects,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Python基于callable函數(shù)檢測對象是否可被調用
這篇文章主要介紹了Python基于callable函數(shù)檢測對象是否可被調用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10
對Python3中的print函數(shù)以及與python2的對比分析
下面小編就為大家分享一篇對Python3中的print函數(shù)以及與python2的對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05

