中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中有哪些導包方式

發布時間:2021-07-05 17:47:34 來源:億速云 閱讀:174 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關Python中有哪些導包方式,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

 1. 直接 import

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

>>> import os >>> os.getcwd() '/home/wangbm'

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

import ... import ... as ... from ... import ... from ... import ... as ...

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

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

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

2. 使用 __import____

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

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

參數介紹:

  • name (required): 被加載 module 的名稱

  • globals (optional): 包含全局變量的字典,該選項很少使用,采用默認值 global()

  • locals (optional): 包含局部變量的字典,內部標準實現未用到該變量,采用默認值 - local()

  • fromlist (Optional): 被導入的 submodule 名稱

  • level (Optional): 導入路徑選項,Python 2 中默認為 -1,表示同時支持 absolute import 和 relative  import。Python 3 中默認為 0,表示僅支持 absolute import。如果大于 0,則表示相對導入的父目錄的級數,即 1 類似于 '.',2  類似于 '..'。

使用示例如下:

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

如果要實現 import xx as yy 的效果,只要修改左值即可

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

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

3. 使用 importlib

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

它的簡單示例:

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

如果要實現 import xx as yy效果,可以這樣

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

4. 使用 imp

imp 模塊提供了一些 import  語句內部實現的接口。例如模塊查找(find_module)、模塊加載(load_module)等等(模塊的導入過程會包含模塊查找、加載、緩存等步驟)。可以用該模塊來簡單實現內建的  __import__ 函數功能:

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

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

5. 使用 execfile

在 Python 2 中有一個 execfile 函數,利用它可以用來執行一個文件。

語法如下:

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

參數有這么幾個:

  • filename:文件名。

  • globals:變量作用域,全局命名空間,如果被提供,則必須是一個字典對象。

  • locals:變量作用域,局部命名空間,如果被提供,可以是任何映射對象。

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

6. 使用 exec

execfile 只能在 Python2 中使用,Python 3.x 里已經刪除了這個函數。

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

示例如下:

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

7. import_from_github_com

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

$ python3 -m pip install import_from_github_com

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

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

$ python3 -m pip install --upgrade pip

確保環境 ok 后,你就可以在 Python shell 中使用 import_from_github_com

示例如下

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

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

8. 遠程導入模塊

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

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

示例代碼如下:

# 新建一個 py 文件(my_importer.py),內容如下 import sys import importlib import urllib.request as urllib2  class UrlMetaFinder(importlib.abc.MetaPathFinder):     def __init__(self, baseurl):         self._baseurl = baseurl       def find_module(self, fullname, path=None):         if path is None:             baseurl = self._baseurl         else:             # 不是原定義的url就直接返回不存在             if not path.startswith(self._baseurl):                 return None             baseurl = path          try:             loader = UrlMetaLoader(baseurl)             return loader         except Exception:             return None  class UrlMetaLoader(importlib.abc.SourceLoader):     def __init__(self, baseurl):         self.baseurl = baseurl      def get_code(self, fullname):         f = urllib2.urlopen(self.get_filename(fullname))         return f.read()      def get_data(self):         pass      def get_filename(self, fullname):         return self.baseurl + fullname + '.py'  def install_meta(address):     finder = UrlMetaFinder(address)     sys.meta_path.append(finder)

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

$ mkdir httpserver && cd httpserver $ cat>my_info.py<EOF name='wangbm' print('ok') EOF $ cat my_info.py name='wangbm' print('ok') $ $ python3 -m http.server 12800 Serving HTTP on 0.0.0.0 port 12800 (http://0.0.0.0:12800/) ... ...

一切準備好,驗證開始。

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

看完上述內容,你們對Python中有哪些導包方式有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瑞丽市| 濮阳市| 从江县| 天长市| 稻城县| 龙州县| 东宁县| 辛集市| 师宗县| 京山县| 镇赉县| 绥中县| 三台县| 古交市| 方城县| 津南区| 全椒县| 北碚区| 大同市| 郎溪县| 凌云县| 贵阳市| 刚察县| 稷山县| 景谷| 大同县| 承德县| 家居| 扶风县| 北流市| 伊川县| 偃师市| 兴隆县| 苍梧县| 宁安市| 安塞县| 宜阳县| 岐山县| 汤原县| 邵阳县| 民乐县|