自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python炫技操作:花式導包的八種方法

開發(fā) 后端
今天這篇文章,跟大家分享 8 種(對,你沒有聽錯,就是 8 種)導入模塊的方法。

 [[326070]]

1. 直接 import

人盡皆知的方法,直接導入即可

 

  1. >>> import os 
  2. >>> os.getcwd() 
  3. '/home/wangbm' 

與此類似的還有,不再細講

 

  1. import ... 
  2. import ... as ... 
  3. from ... import ... 
  4. from ... import ... as ... 

一般情況下,使用 import 語句導入模塊已經(jīng)夠用的。

但是在一些特殊場景中,可能還需要其他的導入方式。

下面我會一一地給你介紹。

2. 使用 __import____

import__ 函數(shù)可用于導入模塊,import 語句也會調用函數(shù)。其定義為:

 

  1. __import__(name[, globals[, locals[, fromlist[, level]]]]) 

參數(shù)介紹:

  • name (required): 被加載 module 的名稱
  • globals (optional): 包含全局變量的字典,該選項很少使用,采用默認值 global()
  • locals (optional): 包含局部變量的字典,內部標準實現(xiàn)未用到該變量,采用默認值 - local()
  • fromlist (Optional): 被導入的 submodule 名稱
  • level (Optional): 導入路徑選項,Python 2 中默認為 -1,表示同時支持 absolute import 和 relative import。Python 3 中默認為 0,表示僅支持 absolute import。如果大于 0,則表示相對導入的父目錄的級數(shù),即 1 類似于 '.',2 類似于 '..'。

使用示例如下:

 

  1. >>> os = __import__('os'
  2. >>> os.getcwd() 
  3. '/home/wangbm' 

如果要實現(xiàn) import xx as yy 的效果,只要修改左值即可

如下示例,等價于 import os as myos:

 

  1. >>> myos = __import__('os'
  2. >>> myos.getcwd() 
  3. '/home/wangbm' 

3. 使用 importlib

importlib是 Python 中的一個標準庫,importlib 能提供的功能非常全面。

它的簡單示例:

 

  1. >>> import importlib 
  2. >>> myos=importlib.import_module("os"
  3. >>> myos.getcwd() 
  4. '/home/wangbm' 

如果要實現(xiàn) import xx as yy效果,可以這樣

 

  1. >>> import importlib 
  2. >>>  
  3. >>> myos = importlib.import_module("os"
  4. >>> myos.getcwd() 
  5. '/home/wangbm' 

4. 使用 imp

imp 模塊提供了一些 import 語句內部實現(xiàn)的接口。例如模塊查找(find_module)、模塊加載(load_module)等等(模塊的導入過程會包含模塊查找、加載、緩存等步驟)??梢杂迷撃K來簡單實現(xiàn)內建的 __import__ 函數(shù)功能:

 

  1. >>> import imp 
  2. >>> file, pathname, desc = imp.find_module('os'
  3. >>> myos = imp.load_module('sep', file, pathname, desc
  4. >>> myos 
  5. <module 'sep' from '/usr/lib64/python2.7/os.pyc'
  6. >>> myos.getcwd() 
  7. '/home/wangbm' 

從 python 3 開始,內建的 reload 函數(shù)被移到了 imp 模塊中。而從 Python 3.4 開始,imp 模塊被否決,不再建議使用,其包含的功能被移到了 importlib 模塊下。即從 Python 3.4 開始,importlib 模塊是之前 imp 模塊和 importlib 模塊的合集。

5. 使用 execfile

在 Python 2 中有一個 execfile 函數(shù),利用它可以用來執(zhí)行一個文件。

語法如下:

 

  1. execfile(filename[, globals[, locals]]) 

參數(shù)有這么幾個:

  • filename:文件名。
  • globals:變量作用域,全局命名空間,如果被提供,則必須是一個字典對象。
  • locals:變量作用域,局部命名空間,如果被提供,可以是任何映射對象。

 

  1. >>> execfile("/usr/lib64/python2.7/os.py"
  2. >>>  
  3. >>> getcwd() 
  4. '/home/wangbm' 

6. 使用 exec

execfile 只能在 Python2 中使用,Python 3.x 里已經(jīng)刪除了這個函數(shù)。

但是原理值得借鑒,你可以使用 open … read 讀取文件內容,然后再用 exec 去執(zhí)行模塊。

示例如下:

 

  1. >>> with open("/usr/lib64/python2.7/os.py""r"as f: 
  2. ...     exec(f.read()) 
  3. ...  
  4. >>> getcwd() 
  5. '/home/wangbm' 

7. import_from_github_com

有一個包叫做 import_from_github_com,從名字上很容易得知,它是一個可以從 github 下載安裝并導入的包。為了使用它,你需要做的就是按照如下命令使用pip 先安裝它。

 

  1. $ python3 -m pip install import_from_github_com 

這個包使用了PEP 302中新的引入鉤子,允許你可以從github上引入包。這個包實際做的就是安裝這個包并將它添加到本地。你需要 Python 3.2 或者更高的版本,并且 git 和 pip 都已經(jīng)安裝才能使用這個包。

pip 要保證是較新版本,如果不是請執(zhí)行如下命令進行升級。

 

  1. $ python3 -m pip install --upgrade pip 

確保環(huán)境 ok 后,你就可以在 Python shell 中使用 import_from_github_com

示例如下

 

  1. >>> from github_com.zzzeek import sqlalchemy 
  2. Collecting git+https://github.com/zzzeek/sqlalchemy 
  3. Cloning https://github.com/zzzeek/sqlalchemy to /tmp/pip-acfv7t06-build 
  4. Installing collected packages: SQLAlchemy 
  5. Running setup.py install for SQLAlchemy ... done 
  6. Successfully installed SQLAlchemy-1.1.0b1.dev0 
  7. >>> locals() 
  8. {'__builtins__': <module 'builtins' (built-in)>, '__spec__': None, 
  9. '__package__': None, '__doc__': None, '__name__''__main__'
  10. 'sqlalchemy': <module 'sqlalchemy' from '/usr/local/lib/python3.5/site-packages/\ 
  11. sqlalchemy/__init__.py'>, 
  12. '__loader__': <class '_frozen_importlib.BuiltinImporter'>} 
  13. >>> 

看了 import_from_github_com的源碼后,你會注意到它并沒有使用importlib。實際上,它的原理就是使用 pip 來安裝那些沒有安裝的包,然后使用Python的__import__()函數(shù)來引入新安裝的模塊。

8. 遠程導入模塊

我在這篇文章里(深入探討 Python 的 import 機制:實現(xiàn)遠程導入模塊),深入剖析了導入模塊的內部原理,并在最后手動實現(xiàn)了從遠程服務器上讀取模塊內容,并在本地成功將模塊導入的導入器。

具體內容非常的多,你可以點擊這個鏈接進行深入學習。

示例代碼如下:

 

  1. # 新建一個 py 文件(my_importer.py),內容如下 
  2. import sys 
  3. import importlib 
  4. import urllib.request as urllib2 
  5.  
  6. class UrlMetaFinder(importlib.abc.MetaPathFinder): 
  7.     def __init__(self, baseurl): 
  8.         self._baseurl = baseurl 
  9.  
  10.  
  11.     def find_module(self, fullname, path=None): 
  12.         if path is None: 
  13.             baseurl = self._baseurl 
  14.         else
  15.             # 不是原定義的url就直接返回不存在 
  16.             if not path.startswith(self._baseurl): 
  17.                 return None 
  18.             baseurl = path 
  19.  
  20.         try: 
  21.             loader = UrlMetaLoader(baseurl) 
  22.             return loader 
  23.         except Exception: 
  24.             return None 
  25.  
  26. class UrlMetaLoader(importlib.abc.SourceLoader): 
  27.     def __init__(self, baseurl): 
  28.         self.baseurl = baseurl 
  29.  
  30.     def get_code(self, fullname): 
  31.         f = urllib2.urlopen(self.get_filename(fullname)) 
  32.         return f.read() 
  33.  
  34.     def get_data(self): 
  35.         pass 
  36.  
  37.     def get_filename(self, fullname): 
  38.         return self.baseurl + fullname + '.py' 
  39.  
  40. def install_meta(address): 
  41.     finder = UrlMetaFinder(address) 
  42.     sys.meta_path.append(finder) 

并且在遠程服務器上開啟 http 服務(為了方便,我僅在本地進行演示),并且手動編輯一個名為 my_info 的 python 文件,如果后面導入成功會打印 ok。

 

  1. $ mkdir httpserver && cd httpserver 
  2. $ cat>my_info.py<EOF 
  3. name='wangbm' 
  4. print('ok'
  5. EOF 
  6. $ cat my_info.py 
  7. name='wangbm' 
  8. print('ok'
  9. $ python3 -m http.server 12800 
  10. Serving HTTP on 0.0.0.0 port 12800 (http://0.0.0.0:12800/) ... 
  11. ... 

一切準備好,驗證開始。

 

  1. >>> from my_importer import install_meta 
  2. >>> install_meta('http://localhost:12800/') # 往 sys.meta_path 注冊 finder 
  3. >>> import my_info  # 打印ok,說明導入成功 
  4. ok 
  5. >>> my_info.name  # 驗證可以取得到變量 
  6. 'wangbm' 

好了,8 種方法都給大家介紹完畢,對于普通開發(fā)者來說,其實只要掌握 import 這種方法足夠了,而對于那些想要自己開發(fā)框架的人來說,深入學習 __import__ 以及 importlib 是非常有必要的。

責任編輯:華軒 來源: Python編程時光
相關推薦

2020-12-21 11:07:58

Python開發(fā)安裝

2020-10-09 09:07:21

Python模塊重載開發(fā)

2021-08-18 11:55:25

Python函數(shù)代碼

2020-04-10 08:59:38

Python合并字典語言

2020-11-26 09:14:47

Python操作 轉義

2023-12-29 09:23:25

Python回調函數(shù)遍歷字典

2020-03-30 09:51:37

Python數(shù)據(jù)語言

2021-04-24 23:01:25

Python語言開發(fā)

2010-05-31 09:51:51

云計算ROI

2023-04-26 15:27:11

JavaScript技巧元素

2022-10-14 10:36:10

職業(yè)道路職業(yè)生涯

2009-04-07 10:52:00

職場工作方法

2023-12-25 15:38:55

2024-12-30 08:20:29

程序并發(fā)任務線程

2024-01-10 08:20:50

Linux編輯器pico

2023-06-26 10:34:53

IT咨詢IT領導者

2023-07-04 13:36:44

2019-10-16 00:53:56

物聯(lián)網(wǎng)設備數(shù)據(jù)安全物聯(lián)網(wǎng)安全

2023-10-16 10:46:35

2009-03-30 14:19:26

優(yōu)化數(shù)據(jù)庫MySQL
點贊
收藏

51CTO技術棧公眾號