python缺少標準庫_Python 實現自動導入缺失的庫

作者:豌豆花下貓

在寫 Python 項目的時候,我們可能經常會遇到導入模塊失敗的錯誤:ImportError: No module named 'xxx'或者ModuleNotFoundError: No module named 'xxx'。

導入失敗問題,通常分為兩種:一種是導入自己寫的模塊(即以 .py 為后綴的文件),另一種是導入三方庫。本文主要討論第二種情況,今后有機會,我們再詳細討論其它的相關話題。

解決導入 Python 庫失敗的問題,其實關鍵是在運行環境中裝上缺失的庫(注意是否是虛擬環境),或者使用恰當的替代方案。這個問題又分為三種情況:

一、單個模塊中缺失的庫

在編寫代碼的時候,如果我們需要使用某個三方庫(如 requests),但不確定實際運行的環境是否裝了它,那么可以這樣:

try:importrequestsexceptImportError:importos

os.system('pip install requests')import requests

這樣寫的效果是,如果找不到 requests 庫,就先安裝,再導入。

在某些開源項目中,我們可能還會看到如下的寫法(以 json 為例):

try:importsimplejson as jsonexceptImportError:import json

這樣寫的效果是,優先導入三方庫 simplejson,如果找不到,那就使用內置的標準庫 json。

這種寫法的好處是不需要導入額外的庫,但它有個缺點,即需要保證那兩個庫在使用上是兼容的,如果在標準庫中找不到替代的庫,那就不可行了。

如果真找不到兼容的標準庫,也可以自己寫一個模塊(如 my_json.py),實現想要的東西,然后在 except 語句中導入它。

try:importsimplejson as jsonexceptImportError:import my_json as json

二、整個項目中缺失的庫

以上的思路是針對開發中的項目,但是它有幾個不足:1、在代碼中對每個可能缺失的三方庫都 pip install,并不可取;2、某個三方庫無法被標準庫或自己手寫的庫替代,該怎么辦?3、已成型的項目,不允許做這些修改怎么辦?

所以這里的問題是:有一個項目,想要部署到新的機器上,它涉及很多三方庫,但是機器上都沒有預裝,該怎么辦?

對于一個合規的項目,按照約定,通常它會包含一個“requirements.txt?”文件,記錄了該項目的所有依賴庫及其所需的版本號。這是在項目發布前,使用命令pip freeze > requirements.txt?生成的。

使用命令pip install -r requirements.txt?(在該文件所在目錄執行,或在命令中寫全文件的路徑),就能自動把所有的依賴庫給裝上。

但是,如果項目不合規,或者由于其它倒霉的原因,我們沒有這樣的文件,又該如何是好?

一個笨方法就是,把項目跑起來,等它出錯,遇到一個導庫失敗,就手動裝一個,然后再跑一遍項目,遇到導庫失敗就裝一下,如此循環……(此處省略 1 萬句臟話)……

三、自動導入任意缺失的庫

有沒有一種更好的可以自動導入缺失的庫的方法呢?

在不修改原有的代碼的情況下,在不需要“requirements.txt”文件的情況下,有沒有辦法自動導入所需要的庫呢?

當然有!先看看效果:

我們以 tornado 為例,第一步操作可看出,我們沒有裝過 tornado,經過第二步操作后,再次導入 tornado 時,程序會幫我們自動下載并安裝好 tornado,所以不再報錯。

autoinstall 是我們手寫的模塊,代碼如下:

#以下代碼在 python 3.6.1 版本驗證通過

importsysimportosfrom importlib importimport_moduleclassAutoInstall():

_loaded=set()

@classmethoddef find_spec(cls, name, path, target=None):if path is None and name not incls._loaded:

cls._loaded.add(name)print("Installing", name)try:

result= os.system('pip install {}'.format(name))if result ==0:returnimport_module(name)exceptException as e:print("Failed", e)returnNone

sys.meta_path.append(AutoInstall)

這段代碼中使用了sys.meta_path?,我們先打印一下,看看它是個什么東西?

Python 3 的 import 機制在查找過程中,大致順序如下:

在 sys.modules 中查找,它緩存了所有已導入的模塊

在 sys.meta_path 中查找,它支持自定義的加載器

在 sys.path 中查找,它記錄了一些庫所在的目錄名

若未找到,拋出ImportError異常

其中要注意,sys.meta_path 在不同的 Python 版本中有所差異,比如它在 Python 2 與 Python 3 中差異很大;在較新的 Python 3 版本(3.4+)中,自定義的加載器需要實現find_spec方法,而早期的版本用的則是find_module。

以上代碼是一個自定義的類庫加載器 AutoInstall,可以實現自動導入三方庫的目的。需要說明一下,這種方法會“劫持”所有新導入的庫,破壞原有的導入方式,因此也可能出現一些奇奇怪怪的問題,敬請留意。

sys.meta_path 屬于 Python 探針的一種運用。探針,即import hook,是 Python 幾乎不受人關注的機制,但它可以做很多事,例如加載網絡上的庫、在導入模塊時對模塊進行修改、自動安裝缺失庫、上傳審計信息、延遲加載等等。

限于篇幅,我們不再詳細展開了。最后小結一下:

可以用 try…except 方式,實現簡單的三方庫導入或者替換

已知全部缺失的依賴庫時(如 requirements.txt),可以手動安裝

利用 sys.meta_path,可以自動導入任意的缺失庫

參考資料:

https://github.com/liuchang0812/slides/tree/master/pycon2015cn

http://blog.konghy.cn/2016/10/25/python-import-hook

https://docs.python.org/3/library/sys.html#sys.meta_path

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443107.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設置角標_iPhone桌面角標顏色

適用設備和系統版本:教程適用于iOS12.0--iOS12.1.2,A9-A12處理器的蘋果設備。其他版本和設備不支持!需要的工具:復制itms-services://?actiondownload-manifest&urlhttps://ignition.fun/install.php%3Fapp%3D352&#xff0c…

中數組的合并_【美團面試題】合并兩個有序數組

【美團面試題】合并兩個有序數組題目描述給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合并到 nums1 中,使 nums1 成為一個有序數組劃重點初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。你可以假設 nums1 有足夠的空間(空間大小大于…

git切換用戶密碼_Java小白入門,常用Git命令有哪些?

Git簡介Git是一個開源的分布式版本控制系統,用于敏捷高效地處理任何或小或大的項目。Git是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。Git與常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本庫的方…

with語句python_Python之with語句

Python之with語句在Python中,我們在打開文件的時候,為了代碼的健壯性,通常要考慮一些異常情況,比如:try:ccfile open(/path/data)contentccfile.readlines()ccfile.close()exceptIOError:log.write(no data read\n)我們…

css中的單位換算_css大小單位px em rem的轉換和詳解

css大小單位px em rem的轉換和詳解PX特點1. IE無法調整那些使用px作為單位的字體大小;2. 國外的大部分網站能夠調整的原因在于其使用了em或rem作為字體單位;3. Firefox能夠調整px和em,rem,但是96%以上的中國網民使用IE瀏覽器(或內…

有幾種部署模式_來!PyFlink 作業的多種部署模式

關于 PyFlink 的博客我們曾介紹過 PyFlink 的功能開發,比如,如何使用各種算子(Join/Window/AGG etc.),如何使用各種 Connector(Kafka, CSV, Socket etc.),還有一些實際的案例。這些都停留在開發階段,一旦開發完成&…

office2007每次打開都配置進度_office2007 每次打開word,excel等顯示正在配置Office Professional Plus 2007的解決方...

有時候 Office2007打開文檔,每次都提示需要安裝。配置,配置完成之后,下次打開又需要配置點擊取消就不能打開。非常的煩。ffice2007下載后為什么每次打開總需要置?office2007每次打開都要正在配置?其實不需要重新安裝可…

mysql命令參數_MySQL命令行參數完整版

MySQL命令行參數完整版mysql教程支持下面的選項:---help,-?顯示幫助消息并退出。--batch,-B打印結果,使用tab作為列間隔符,每個行占用新的一行。使用該選項,則mysql不使用歷史文件。--character…

consul 文件夾無法顯示_consul集群搭建參考

1.官網下載安裝包https://releases.hashicorp.com/consul/1.4.3/consul_1.4.3_linux_amd64.zip2.部署節點如下192.168.8.142 sxconsul1192.168.8.143 sxconsul2192.168.8.144 sxconsul33.解壓之后的consul是一個可執行文件,復制到/usr/local/bin/ 下4.三臺服務器創建…

mysql linux環境安裝_MySQL Linux環境的安裝配置

在Kali中已經內置了MySQL(鏡像可以從mysql.com/downloads/ 下載安裝)奇怪的是博主我的kali內置的是mariaDB數據庫,所以我也懶得弄MySQL了!直接mariaDB吧!差不多【PS:據博主所致,mariaDB的操作和MySQL一樣哦!在這后面有…

mysql not in 轉化_[轉]mysql里not in語句怎么寫 | 學步園

使用mysql中經常會遇到的問題,記錄下來轉自: http://database.e800.com.cn/articles/2007/630/1183147360019880660_1.htmlselect bid from board where not in (select bid from favorite)但在mysql里就提示SQL語句的語法不對,“...near sel…

java mysql 事物_java基礎之MySQL事務和視圖

第三節 事務和視圖3.1事務事務是用來維護數據庫完整性的,它能夠保證一系列的MySQL操作要么全部執行,要么全不執行。舉一個例子來進行說明,例如轉賬操作:A賬戶要轉賬給B賬戶,那么A賬戶上減少的錢數和B賬戶上增加的錢數必…

define定義的是什么類型_DEFINE_PROFILE用法介紹(1)

“ 長風破浪會有時,直掛云帆濟滄海!”01—概述可以使用DEFINE_PROFILE定義一個自定義邊界配置文件或單元格區域條件,該條件隨空間坐標或時間而變化。可以自定義的變量如下:速度,壓力,溫度,湍流動能&#xf…

如何判斷輸入的是字符還是數字_[Leetgo]判斷字符串是否為數字

題解分析代碼實現實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。題解分析一個標識數字的字符串可能包括以下字符類型:空格;數組:0~9;正負號小數點冪符號:e/E;為了解決此類問題,需要…

mysql索引優化面試題_mysql索引優化面試題

曾經偷偷的面試了兩個單位,都提到了Mysql的優化問題,所以以后要多多學習數據庫的優化知識了。建設數據庫的優化大概主要就是索引的優化了吧,因為我們不可能修改數據結構的情況下,提高數據庫的查詢效率似乎也只能用索引了。當然這也…

python 可視化大屏幕_如何用python搭建可視化看板?

可視化看板是指大屏 駕駛艙 dashboard這些嗎,如果是,那不建議用python來做,不專業,目前沒有見過哪個項目上的大屏是用python做的,它不是萬能的大屏的制作一般是這樣的先根據用戶的需求,所在的行業&#xff…

mysql語句轉為sql語句_MySQL 的分頁查詢 SQL 語句(轉)

轉自 https://www.cnblogs.com/wbxk/p/10644766.htmlMySQL一般使用 LIMIT 實現分頁。基本語句為:SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...在中小數據量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用了索引。舉例…

mysql查詢選課最少成績最高_MySQL 練習

最近在學習MYSQL 數據庫,在此mark 一下做過的sql 相關練習表結構如下:teacher表tidtnameclass表cidcaptioncourse表cidcnameteacher_idstudent表sidgenderclass_idsnamescore表sidstudent_idcourse_idnumclass :teacher : course : student :score : 根…

mysql中nchar_淺談SQL Server、MySQL中char,varchar,nchar,nvarchar區別

1,定義:char: 固定長度,存儲ANSI字符,不足的補英文半角空格。nchar: 固定長度,存儲Unicode字符,不足的補英文半角空格varchar: 可變長度,存儲ANSI字符&…

mysql 5.764_RHEL5.764位源碼編譯安裝MySQL-5.5.42遇到的問題

由于MySQL從5.5之后的版本源碼編譯安裝用cmake, make, make install安裝,不用./Configure,make,make install 安裝,所以要看下系由于MySQL從5.5之后的版本源碼編譯安裝用cmake, make, make install安裝,不用./Configure,make,make install 安裝,所以要看…