日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:imp——由代碼內(nèi)部訪問import。

imp —— 由代碼內(nèi)部訪問 import 。

源代碼: Lib/imp.py

目前創(chuàng)新互聯(lián)建站已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計、魯山網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

從版本 3.4 開始標(biāo)記為過時,將在版本 3.12 中移除。: imp 模塊已被廢棄,請改用 importlib。


本模塊提供了一個接口,用于實(shí)現(xiàn) import 語句的機(jī)制。這里定義了以下常量和函數(shù):

imp.get_magic()

返回用于識別字節(jié)編譯代碼文件 (.pyc files) 的魔術(shù)字符串值。 (該值對于各個 python 版本可能不同。)

3.4 版后已移除: 改用 importlib.util.MAGIC_NUMBER。

imp.get_suffixes()

返回一個 3 元素元組的列表,每個元組描述了一個特定的模塊類型。 每個三元組的形式為 (suffix, mode, type),其中 suffix 是要附加到模塊名稱上以組成要搜索的文件名的字符串,mode 是要傳給內(nèi)置 open() 函數(shù)以打開該文件的模式字符串 (可以為針對文本文件的 'r' 或針對二進(jìn)制文件的 'rb'),而 type 是文件類型,它的值為 PY_SOURCE, PY_COMPILED 之一 C_EXTENSION,具體說明如下。

3.3 版后已移除: 改用在 importlib.machinery 上定義的常量。

imp.find_module(name[, path])

嘗試找到模塊 name。 如果 path 被省略或?yàn)?None,則會搜索 sys.path 給出的目錄名列表,但在此前會先搜索幾個特殊位置:該函數(shù)將嘗試找到具有給定名稱的內(nèi)置模塊 (C_BUILTIN),然后是凍結(jié)模塊 (PY_FROZEN),并且在某些系統(tǒng)上還會查找其他幾個位置(在 Windows 上,它將查看注冊表,其中可能指向某一特定文件)。

在其他情況下,path 必須是一個目錄名列表;將在每個目錄中搜索具有上述 get_suffixes() 所返回的任何后綴的文件。 列表中的無效名稱將被靜默地忽略(但是所有列表?xiàng)l目都必須為字符串)。

如果搜索成功,返回值將是一個 3 元素元組 (file, pathname, description):

file 是一個放在最前面的已打開的 file object,pathname 是打到的文件的路徑名,而 description 是一個描述所找到的模塊種類的 3 元素元組,如 get_suffixes() 所返回的列表中包含的內(nèi)容。

如果模塊為內(nèi)置或凍結(jié)模塊則 filepathname 都將為 None 并且 description 元組將包含空字符串來表示其后綴和模式;模塊類型按上述圓括號中所給出的內(nèi)容來指明。 如果搜索未成功,則會引發(fā) ImportError。 其他異常被用于指示參數(shù)或環(huán)境問題。

如果模塊是一個包,則 file 將為 Nonepathname 將為包路徑而 description 元組的最后一項(xiàng)將為 PKG_DIRECTORY。

此函數(shù)不會處理多層級的模塊名稱(包含點(diǎn)號的名稱)。 為了找到 P.M,也就是 P 包的的子模塊 M,請使用 find_module() 和 load_module() 來找到并載入 P 包,然后使用 find_module() 并將 path 參數(shù)設(shè)為 P.__path__。 當(dāng) P 本身也具有帶點(diǎn)號的名稱時,請遞歸地應(yīng)用此步驟。

3.3 版后已移除: 請改用 importlib.util.find_spec() 除非需要兼容 Python 3.3,對于后一種情況請使用 importlib.find_loader()。 要查看對于前一種情況的示例用法,請參閱 importlib 文檔的 例子 小節(jié)。

imp.load_module(name, file, pathname, description)

加載之前由 find_module() 所找到的模塊(或由其他方式執(zhí)行搜索所產(chǎn)生的兼容的結(jié)果)。 此函數(shù)所做的不只是導(dǎo)入模塊:如果模塊已經(jīng)被導(dǎo)入,它將重新加載此模塊! name 參數(shù)指明完整的模塊名稱(包括包名,如果它是一個包的子模塊的話)。 file 參數(shù)是一個打開的文件,而 pathname 是相應(yīng)的文件名;當(dāng)模塊是一個包或者不是從文檔加載時,它們可以分別為 None''。 description 參數(shù)是一個元組,如 get_suffixes() 將返回的內(nèi)容一樣,描述了必須加載什么樣的模塊。

如果加載成功,則返回值為相應(yīng)的模塊對象;否則,將引發(fā)一個異常 (通常為 ImportError)。

重要: 調(diào)用方需負(fù)責(zé)關(guān)閉 file 參數(shù),如果它不為 None 的話,即使是在有異常被引發(fā)時。 這最好是使用 try … finally 語句來實(shí)現(xiàn)。

3.3 版后已移除: 如果之前是與 imp.find_module() 一起使用則可考慮使用 importlib.import_module(),在其他情況下請使用你選擇的 imp.find_module() 替代品所返回的加載器。 如果你直接附帶文件路徑參數(shù)調(diào)用 imp.load_module() 和相關(guān)函數(shù)則請使用 importlib.util.spec_from_file_location() 和 importlib.util.module_from_spec() 的組合。 參見 importlib 文檔的 例子 小節(jié)來了解各種方式的細(xì)節(jié)。

imp.new_module(name)

返回一個新的名為 name 的空模塊對象。 此對象 不會 被插入到 sys.modules 中。

3.4 版后已移除: 請改用 importlib.util.module_from_spec()。

imp.reload(module)

重新加載之前導(dǎo)入的 module。 該參數(shù)必須是一個模塊對象,因此它之前必須已經(jīng)被成功導(dǎo)入了。 這在當(dāng)你已使用外部編輯器編輯過模塊源代碼文件并想在不退出 Python 解釋器的情況下嘗試新版本時會很有用處。 返回值為模塊對象(與 module 參數(shù)所指向的相同)。

當(dāng) reload(module) 被執(zhí)行時:

  • Python 模塊的代碼會被重新編譯并且模塊層級的代碼將重新執(zhí)行,定義一個新的綁定到模塊字典中的名稱的對象集合。 擴(kuò)展模塊的 init 函數(shù)不會被重復(fù)調(diào)用。

  • 與Python中的所有的其它對象一樣,舊的對象只有在它們的引用計數(shù)為0之后才會被回收。

  • 模塊命名空間中的名稱重新指向任何新的或更改后的對象。

  • 其他舊對象的引用(例如那個模塊的外部名稱)不會被重新綁定到引用的新對象的,并且如果有需要,必須在出現(xiàn)的每個命名空間中進(jìn)行更新。

有一些其他注意事項(xiàng):

當(dāng)一個模塊被重新加載的時候,它的字典(包含了那個模塊的全區(qū)變量)會被保留。名稱的重新定義會覆蓋舊的定義,所以通常來說這不是問題。如果一個新模塊沒有定義在舊版本模塊中定義的名稱,則將保留舊版本中的定義。這一特性可用于作為那個模塊的優(yōu)點(diǎn),如果它維護(hù)一個全局表或者對象的緩存 —— 使用 try 語句,就可以測試表的存在并且跳過它的初始化,如果有需要的話:

 
 
 
 
  1. try:
  2. cache
  3. except NameError:
  4. cache = {}

重新加載內(nèi)置或動態(tài)加載的模塊是合法操作但通常不是很有用處,除非是 sys, __main__ 和 builtins。 但是在許多情況下,擴(kuò)展模塊并不是被設(shè)計為可被多次初始化的,并可能在重新加載時以任意方式失敗。

如果一個模塊使用 from … import … 導(dǎo)入來自另一個模塊的對象,則為另一個模塊調(diào)用 reload() 并不會重新定義從其中導(dǎo)入的對象 —- 繞過此問題的一種方式是重新執(zhí)行 from 語句,另一種方式是使用 import 和限定名稱 (module.*name*) 來代替。

如果一個模塊創(chuàng)建一個類的實(shí)例,重新加載定義那個類的模塊不影響那些實(shí)例的方法定義———它們繼續(xù)使用舊類中的定義。對于子類來說同樣是正確的。

在 3.3 版更改: 依賴于 __name____loader__ 而不僅是 __name__ 同時定義在被重新加載的模塊上。

3.4 版后已移除: 使用 importlib.reload() 來代替。

下列函數(shù)可以方便地處理 PEP 3147 字節(jié)編譯的文件路徑。

3.2 新版功能.

imp.cache_from_source(path, debug_override=None)

返回與源 PEP 3147 定義的 path 相關(guān)聯(lián)的已編譯字節(jié)碼文件的路徑。 舉例來說,如果 path/foo/bar/baz.py 則 Python 3.2 中的返回值將是 /foo/bar/__pycache__/baz.cpython-32.pyc。 字符串 cpython-32 來自于當(dāng)前的魔術(shù)標(biāo)簽 (參見 get_tag(); 如果 sys.implementation.cache_tag 未定義則將引發(fā) NotImplementedError)。 通過為 debug_override 傳入 TrueFalse 你可以覆蓋系統(tǒng)設(shè)置的 __debug__ 值,以生成優(yōu)化的字節(jié)碼。

path 不必存在。

在 3.3 版更改: 如果 sys.implementation.cache_tagNone,則會引發(fā) NotImplementedError。

3.4 版后已移除: 使用 importlib.util.cache_from_source() 來代替。

在 3.5 版更改: debug_override 形參不會再創(chuàng)建 .pyo 文件。

imp.source_from_cache(path)

根據(jù)給定的 PEP 3147 文件名的 path,返回相關(guān)聯(lián)的源代碼文件路徑。 舉例來說,如果 path/foo/bar/__pycache__/baz.cpython-32.pyc 則返回的路徑將是 /foo/bar/baz.pypath 不必已存在,但是如果它未遵循 PEP 3147 格式,則會引發(fā) ValueError。 如果未定義 sys.implementation.cache_tag,則會引發(fā) NotImplementedError。

在 3.3 版更改: 當(dāng)未定義 sys.implementation.cache_tag 時將引發(fā) NotImplementedError。

3.4 版后已移除: 使用 importlib.util.source_from_cache() 來代替。

imp.get_tag()

返回與此 Python 版本魔數(shù)相匹配的 PEP 3147 魔術(shù)標(biāo)簽字符串,如 get_magic() 所返回的。

3.4 版后已移除: 從 Python 3.3 開始直接使用 sys.implementation.cache_tag

以下函數(shù)可以幫助與導(dǎo)入系統(tǒng)的內(nèi)部鎖定機(jī)制進(jìn)行交互。 導(dǎo)入的鎖定語義是一個可能在不同發(fā)布版之間發(fā)生改變的實(shí)現(xiàn)細(xì)節(jié)。 但是,Python 會確保循環(huán)導(dǎo)入操作不會出現(xiàn)任何死鎖。

imp.lock_held()

如果當(dāng)前持有全局導(dǎo)入鎖則返回 True,否則返回 False。 在沒有線程的系統(tǒng)平臺上,將總是返回 False。

在有線程的平臺上,執(zhí)行導(dǎo)入的線程首先會持有一個全局導(dǎo)入鎖,然后為導(dǎo)入其余部分設(shè)置模塊專屬鎖。 這將阻止其他線程導(dǎo)入相同的模塊直到原始導(dǎo)入完成,防止其他線程看到由原始線程構(gòu)建的不完整的模塊對象。 循環(huán)導(dǎo)入是個例外情況,它在構(gòu)造上就必須在某一時刻暴露不完整的模塊對象。

在 3.3 版更改: 鎖定方案在大多數(shù)情況下都已改為按模塊鎖定。 對于某些關(guān)鍵任務(wù)會保留一個全局導(dǎo)入鎖,比如初始化每個模塊的鎖。

3.4 版后已移除.

imp.acquire_lock()

為當(dāng)前線程獲取解釋器的全局導(dǎo)入鎖。 這個鎖應(yīng)當(dāng)由導(dǎo)入鉤子來使用以確保導(dǎo)入模塊時的線程安全。

一旦某個線程獲取了導(dǎo)入鎖,同一個線程可以再次獲取它而不會阻塞;該線程每次獲得它都必須再釋放它一次。

在沒有線程的平臺上,此函數(shù)將不做任何操作。

在 3.3 版更改: 鎖定方案在大多數(shù)情況下都已改為按模塊鎖定。 對于某些關(guān)鍵任務(wù)會保留一個全局導(dǎo)入鎖,比如初始化每個模塊的鎖。

3.4 版后已移除.

imp.release_lock()

釋放解釋器的全局導(dǎo)入鎖。 在沒有線程的平臺上,此函數(shù)將不做任何操作。

在 3.3 版更改: 鎖定方案在大多數(shù)情況下都已改為按模塊鎖定。 對于某些關(guān)鍵任務(wù)會保留一個全局導(dǎo)入鎖,比如初始化每個模塊的鎖。

3.4 版后已移除.

以下是在本模塊中定義的具有整數(shù)值的常量,用來表示 find_module() 的搜索結(jié)果。

imp.PY_SOURCE

模塊作為一個源文件被發(fā)現(xiàn)。

3.3 版后已移除.

imp.PY_COMPILED

模塊作為一個已編譯代碼對象文件被發(fā)現(xiàn)。

3.3 版后已移除.

imp.C_EXTENSION

模塊作為動態(tài)可加載共享庫被發(fā)現(xiàn)。

3.3 版后已移除.

imp.PKG_DIRECTORY

模塊作為一個包目錄被發(fā)現(xiàn)。

3.3 版后已移除.

imp.C_BUILTIN

模塊作為一個內(nèi)置模塊被發(fā)現(xiàn)。

3.3 版后已移除.

imp.PY_FROZEN

模塊作為一個凍結(jié)模塊被發(fā)現(xiàn)。

3.3 版后已移除.

class imp.NullImporter(path_string)

NullImporter 類型是一個在無法找到任何模塊時處理非目錄路徑字符串 PEP 302 導(dǎo)入鉤子。 調(diào)用此類型時傳入一個現(xiàn)有目錄或空字符串將引發(fā) ImportError。 在其他情況下,將返回一個 NullImporter 實(shí)例。

這些實(shí)例只有一個方法:

  • find_module(fullname[, path])

    此方法總是返回 None,表示所請求的模塊無法找到。

在 3.3 版更改: 將把 None 插入到 sys.path_importer_cache 而不是 NullImporter 的實(shí)例。

3.4 版后已移除: 改為將 None 插入到 sys.path_importer_cache

例子

以下函數(shù)模擬了 Python 1.4 及之前版本的標(biāo)準(zhǔn)導(dǎo)入語句(沒有多層級的模塊名稱)。 (這個 實(shí)現(xiàn) 不可用于那些版本,因?yàn)?find_module() 已經(jīng)被擴(kuò)展而 load_module() 在 1.4 中已被添加。)

 
 
 
 
  1. import imp
  2. import sys
  3. def __import__(name, globals=None, locals=None, fromlist=None):
  4. # Fast path: see if the module has already been imported.
  5. try:
  6. return sys.modules[name]
  7. except KeyError:
  8. pass
  9. # If any of the following calls raises an exception,
  10. # there's a problem we can't handle -- let the caller handle it.
  11. fp, pathname, description = imp.find_module(name)
  12. try:
  13. return imp.load_module(name, fp, pathname, description)
  14. finally:
  15. # Since we may exit via an exception, close fp explicitly.
  16. if fp:
  17. fp.close()

標(biāo)題名稱:創(chuàng)新互聯(lián)Python教程:imp——由代碼內(nèi)部訪問import。
當(dāng)前網(wǎng)址:http://m.5511xx.com/article/ccspshd.html