1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Python炫技操作:花式導(dǎo)包的八種方法

        共 5244字,需瀏覽 11分鐘

         ·

        2021-01-07 19:03

        點擊上方“Python編程時光”,選擇“加為星標(biāo)
        第一時間關(guān)注Python技術(shù)干貨!


        系列導(dǎo)讀


        Python 炫技操作(01):條件語句的七種寫法

        Python 炫技操作(02):合并字典的七種方法

        Python 炫技操作(03):連接列表的八種方法

        Python 炫技操作(04):海象運(yùn)算符的三種方法


        大家好,我是明哥。

        炫技操作系列》已經(jīng)更新至第五篇,今天這篇文章,跟大家分享 8 種(對,你沒有聽錯,就是 8 種)導(dǎo)入模塊的方法。


        1. 直接 import

        人盡皆知的方法,直接導(dǎo)入即可

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

        與此類似的還有,不再細(xì)講

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

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

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

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

        2. 使用 __import__

        __import__ 函數(shù)可用于導(dǎo)入模塊,import 語句也會調(diào)用函數(shù)。其定義為:

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

        參數(shù)介紹:

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

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

        • locals (optional): 包含局部變量的字典,內(nèi)部標(biāo)準(zhǔn)實現(xiàn)未用到該變量,采用默認(rèn)值 - local()

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

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

        使用示例如下:

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

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

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

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

        3. 使用 importlib

        importlib 是 Python 中的一個標(biāo)準(zhǔn)庫,importlib 能提供的功能非常全面。

        它的簡單示例:

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

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

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

        4. 使用 imp

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

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

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

        5. 使用 execfile

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

        語法如下:

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

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

        • filename:文件名。

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

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

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

        6. 使用 exec

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

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

        示例如下:

        >>>?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 下載安裝并導(dǎo)入的包。為了使用它,你需要做的就是按照如下命令使用pip 先安裝它。

        $?python3?-m?pip?install?import_from_github_com

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

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

        $?python3?-m?pip?install?--upgrade?pip

        確保環(huán)境 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__':?'builtins'?(built-in)>,?'__spec__':?None,
        '__package__':?None,?'__doc__':?None,?'__name__':?'__main__',
        'sqlalchemy':?'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__()函數(shù)來引入新安裝的模塊。

        8. 遠(yuǎn)程導(dǎo)入模塊

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

        具體內(nèi)容非常的多,你可以點擊這個鏈接進(jìn)行深入學(xué)習(xí)。

        示例代碼如下:

        #?新建一個?py?文件(my_importer.py),內(nèi)容如下
        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)

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

        $?mkdir?httpserver?&&?cd?httpserver
        $?cat>my_info.py
        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/)?...
        ...

        一切準(zhǔn)備好,驗證開始。

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


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


        另外,強(qiáng)烈給大家推薦的這篇文章深入探討 Python 的 import 機(jī)制:實現(xiàn)遠(yuǎn)程導(dǎo)入模塊?,對于你理解Python? import 機(jī)制會很有幫助。


        明哥原創(chuàng)文都已傳至 Github:https://github.com/iswbm/PythonCodingTime

        本文永久博客鏈接:http://python.iswbm.com/en/latest/c01/c01_45.html


        最后,想看更多這個系列的朋友,請幫忙?轉(zhuǎn)發(fā)文章、或者?點個在看,只有看的人多了,我的更新速度也才能快起來。




        長按下圖? ?? ?關(guān)注博主

        (按左邊關(guān)注?Python, 按右邊關(guān)注?Goalng




        瀏覽 35
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产精品久久久久永久免费观看 | 男人吃女人胸的视频 | 韩剧大尺度免费观看电影 | 少妇一级淫片aaaaaaa | 精品一区久九综合 | AAA黄色大片 | 日本动漫无码 有限公司 | 丝袜足交网 | 一级免费黄色视频 | 秘书裸侍跪趴等老板调教电影 |