27 python的模組和包的定址引用分析

2021-10-25 06:22:12 字數 2011 閱讀 5367

我們來講下python的模組和包,這部分內容是跟我們後面做擴充套件息息相關的,因為我們最終做的c++程式就是以模組的方式提供給python,當然了,還有另外一種方式,就是直接通過動態鏈結庫、通過ctypes來獲取,除了這兩種方案,當然還有其他方案,方案比較多。

我們主要講兩種方案,一種就是直接動態鏈結庫,通過python的介面來呼叫;還有一種就是我們直接編譯成python的模組。

當然了,python的模組不只是用來做擴充套件用的,因為python本身就可以開發自己的模組,python的模組是什麼意思呢?

可以把python的每乙個檔案理解成模組,就是乙個**檔案就理解成乙個模組,那麼如何來引用這個模組呢?

它這個模組可以匯入的既是py原始碼,或者py編譯過的,或者是pyd我們的擴充套件庫,注意是擴充套件庫,而不是普通的pyd庫,因為普通的pyd庫是通過ctypes來獲取的。

還有一種匯入方法:

匯入乙個模組,然後import這個模組裡面的一些內容,比方說我們只import裡面的乙個類,或者import裡面的乙個函式,或者我們只訪問它內部的乙個變數。

這個語法除了是可以匯入模組之外呢,這個import還可以匯入包,我們可以從乙個包裡面匯入它的其中某乙個模組。

packet就是在乙個目錄下面包含乙個__init__.py這樣乙個檔案,當你包含了乙個包之後,在這個檔案裡面可以做一些初始化,甚至可以在裡面做一些函式,放在我們這個__init__.py檔案當中。

注意一點,如果from module import *的話,它會把這個模組內部的所有函式、變數都匯入進來;

而我們在做這個from pack import *的時候,它並不會把所有的模組都匯入進來,它會訪問__all__這樣乙個變數,把這個變數裡面的模組全部匯入進來,所以我們一旦用了import *之後,我們可以在__init__.py檔案當中配置這個__all__變數,告訴它我們在這個包裡面哪些模組是我需要引用的。

獲取當前模組的名稱。

通過這種方式我們就可以判斷這個模組是被import進來的,還是說是我們直接執行的,如果是直接執行的話,我們要做一些處理,如果是import的時候我們要做哪些處理,這都可以放在我們的模組類當中來去做判斷。

前面我們講了引入模組,甚至引入動態庫的模組,引入包,都涉及到目錄,那你們有沒有想過這個目錄到哪邊去找呢?

import sys

sys.path # list

其實這個模組的匯入路徑在我們python當中,提供了乙個sys模組,有些模組是我們系統自帶的模組,裡面有乙個sys.path,它是乙個list,裡面存放了我們所有找的路徑,就是當我們載入乙個模組或者是動態庫,我們查詢的路徑,會在這個list裡面存放的路徑當中去查詢,當然了這個路徑也有侷限性,像我們做c++擴充套件的時候,如果涉及到動態鏈結庫又引用了動態鏈結庫的時候,python是不知道的,只有我們c++知道,所以那個可能還要配到系統路徑下;

對所有的python模組、python**的包,我們是可以通過這個路徑來設定,假定乙個庫在多個路徑下都有,那它取哪乙個呢?

那肯定有乙個次序,就是按照list裡面的次序,開始的優先順序最高,所以如果我們想自己建乙個目錄,讓它到我們這個目錄當中來找這個模組,那你可以通過sys.path.insert插入乙個路徑到list的開始位置,例如:

sys.path.insert(0,

"../"

)

我就定義當前**的上一層路徑,你就到上一層去找我們對應的這個模組,這個設定完之後,你再去import,它就多了乙個引導的路徑來找到你對應的模組。

python 模組和包 python模組和包

一.模組 python 模組 module 是乙個 python 檔案,以 py 結尾,包含了 python 物件定義和python語句。模組能定義函式,類和變數,模組裡也能包含可執行的 二.匯入模組 1.語法 import模組名from 模組名 import功能名from 模組名 import i...

python的模組和包

all 的用法 在模組中定義 all xx,x,用來限制使用from.import 時匯入的屬性 方法 或類。也可以在模組中定義變數名時使用 開頭來限制匯入。import語句用法 使用import 來匯入模組和包 from.import.用法 from.import 用法 from.import.用...

python的模組和包

乙個py檔案就可以作為乙個模組 模組的匯入 直接匯入檔案的名字,不需要帶著字尾 模組中的函式呼叫 模組名.函式名 匯入模組的時候做了三件事 1.首先開闢了乙個新的命名空間my moudle 2.執行了my moudle內的 3.將my moudle裡面的名字和命名空間繫結在一起了 注意 模組在乙個程...