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

2021-02-20 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]])

參數有這麼幾個:

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

6. 使用 exec

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

但是原理值得借鑑,你可以使用 open … 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 炫技操作:五種 Python 轉義表示法
    轉義的 5 種表示法 ASCII 有 128 個字符,如果用 八進位表示,至少得有三位數,才能將其全部表示。這就是為什麼說上面的首位 0 不能省略的原因,即使現在用不上,我也得把它空出來。而如果使用十六進位,只要兩位數就其 ASCII 的字符全部表示出來。同時為了避免和八進位的混淆起來,所以在 \ 後面要加上英文字母 x 表示十六進位,後面再接兩位十六進位的數值。
  • Python 炫技操作:模塊重載的五種方法
    >>> from foo import barsuccessful to be imported>>> from foo import bar>>>重載模塊方法一 如果你使用的 python2(記得前面在 foo 文件夾下加一個 __init__.py),有一個 reload 的方法可以直接使用
  • Python 炫技操作:條件語句的七種寫法
    本文我將寫一寫很簡單的條件判斷語句裡那些炫技操作,在這裡,如果你是 Python 發燒友,你可以學到一些寫出超酷的代碼書寫技巧,但學習歸學習,希望你區分場景使用。這是一段非常簡單的通過年齡判斷一個人是否成年的代碼,由於代碼行數過多,有些人就不太願意這樣寫,因為這體現不出自己多年的 Python 功力。
  • Python詞雲:Windows安裝Wordcloud報錯解決辦法
    不過沒關係,今天我手把手教你怎麼安裝Wordcloud包。首先,先看清楚你的python版本,以及搞清楚你的python是基於32位系統還是64位系統。具體操作方法:1、 在左下角搜索windows搜索框裡輸入cmd,打開命令行窗口;2、 輸入python;3、 這裡可以看到python的版本是3.8.2,基於32位系統。這裡要提醒大家不要去看電腦屬性裡的系統位數,比如我的電腦屬性裡的系統位數,這裡是64位作業系統。
  • 圖解髖關節脫位復位:八種方法
    髖關節脫位復位手法有15種之多,本期我們配圖來講解其中的八種手法。
  • Python的數據可視化:對比7種工具包
    Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
  • Python學習:mac電腦安裝python教程
    與python2.7 共存2 下載安裝包進入官方安裝包下載頁面,https://www.python.org/downloads/mac-osx/找到合適的安裝包,基本上mac電腦都是64位的系統,因此選擇64位的安裝包進行下載
  • 當街玩漂移炫技,噪音轟鳴刺耳!南寧這4個年輕仔被交警抓了
    近日,有南寧市民發現,在南寧市濱江路上有車輛聚集,並炫技駕駛,發出陣陣轟鳴聲。這不僅噪音擾民,還存在交通安全隱患。
  • python基礎學習教程:Python基礎語法
    讓我們嘗試另一種方式來執行 Python 腳本。以雙下劃線開頭的 __foo 代表類的私有成員,以雙下劃線開頭和結尾的 __foo__ 代表 Python 裡特殊方法專用的標識,如 __init__() 代表類的構造函數。
  • python黑知識:python本體
    講述python的實現本體,版本,構建時間,構建工具和構建參數python的實現有很多種,如果想研究一下它語言本身一些機制的實現,可能需要看原始碼,那麼,就需要找到相應的實現,分支和版本。目前使用的python實現,根據python實現存在有這幾種CPython, Stackless Python, MicroPython, CLPython, Cython, IronPython, Jython, Pyjs, PyPy, Numba, Shed Skin Nuitka ,可以說是讓人眼花繚亂。
  • 有圖有真相:可攜式心電圖機常見操作故障處理方法
    臨床常用的主要有四個肢導和六個胸導。肢導連接方法:R(紅色)右上肢L(黃色)左上肢N(黑色)右下肢F(綠色)左下肢胸導連接方法:V1(紅色)胸骨右緣第 4 肋間V2(黃色)胸骨左緣第 4 肋間V3(綠色)V2 和 V4 連線的中點
  • Python 情人節告白特技:隱藏在聊天記錄裡的珍貴禮物
    一、導出自己和對象的數據~微信的備份功能並不能直接給你導出文本格式,它導出來其實是一種叫sqlite的資料庫。如果說用網上流傳的方法提取文本數據,iOS則需要下載itunes備份整機,安卓則需要本機的root權限,無論是哪種都非常麻煩,在這裡給大家介紹一種不需要整機備份和本機root權限,只導出和對象的聊天數據的方法。
  • 「那時我玩直排輪四五年,正是炫技的時候……」
    「那時我玩直排輪四五年,正是炫技的時候。希望被人注意到,希望讓人家對你有印象,想聽到很多掌聲和歡呼聲。頭腦一熱,就會冒險做一些能力之上的事情。受傷最嚴重的一次,是在一個商場表演,現場有很多觀眾。
  • pandas 花式保存 Excel 數據的 N 種姿勢!
    關於set_column方法:相關資料1. python讀寫Excel文件的那些庫來源:http://www.python-excel.org/讀取和寫入EXCEL2010文件的包(即.xlsx)文檔:https://openpyxl.readthedocs.org
  • Python生成一維碼,二維碼
    我們的生活已完全離不開一維碼和二維碼,本文會簡單的介紹如果通過python的方法來生成它們
  • Python 進階必備:圖像庫 pillow
    Image 模塊是為了快速訪問以下幾種基本像素格式存儲的數據而設計的,為一般的圖像處理工具提供了一個堅實的基礎。下表是 pillow 庫中最常用的3個子模塊(圖像處理、編輯、截屏)和3個輔助模塊(過濾器、顏色、字體)。子模塊說明ImageImage模塊提供了一個同名的類,用來表示PIL圖像。該模塊還提供了許多工廠功能,包括從文件加載圖像和創建新圖像的功能。
  • 聚焦 | 代春桂:生技崗上的「女漢子」
    當時大家都認為女性不適合做生技員。好在當時生技課主管認為女員工也做好生技工作,便破格錄取代春桂。於是,代春桂成為生技課裡的一員。初入生技,重重困難。因為人員緊缺,才到生技課的代春桂就要跟著老員工一邊負責架設機臺,一邊學習機臺維護和異常處理。面對陌生的新環境、專業的知識需求和鋒利的機臺刀具,代春桂也只能硬著頭皮上。在老員工架設機臺的時候,代春桂便跟著他們學習如何操作和維護機臺。
  • 炫石太子與年度亞軍背鍋?
    小八現在每天都有開播哦!
  • 有趣且鮮為人知的 Python 特性,火了!
    項目地址為:https://github.com/leisurelicht/wtfpython-cn來體會一些難以理解和反人類直覺的Python特性吧!引用自 https://docs.python.org/3/c-api/long.html可以再看看這個案例:>>> id(256)10922528>>> a = 256>>> b = 256>>> id(a)10922528>&