>> import os>>> os.getcwd()'/home/wangbm'與此類似的還有,不再細(xì)講import ...import ... as ...from ... import ...from ... import ... as ...一般情況下,使用 i..." />
<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python炫技操作

          共 4656字,需瀏覽 10分鐘

           ·

          2020-10-05 21:42

          01?直接 import


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

          >>> import os>>> os.getcwd()'/home/wangbm'
          與此類似的還有,不再細(xì)講
          import ...import ... as ...from ... import ...from ... import ... as ...

          一般情況下,使用 import 語(yǔ)句導(dǎo)入模塊已經(jīng)夠用的。
          但是在一些特殊場(chǎng)景中,可能還需要其他的導(dǎo)入方式。
          下面我會(huì)一一地給你介紹。

          02?使用 __import__


          __import__ 函數(shù)可用于導(dǎo)入模塊,import 語(yǔ)句也會(huì)調(diào)用函數(shù)。其定義為:
          __import__(name[, globals[, locals[, fromlist[, level]]]])

          參數(shù)介紹:
          • name (required): 被加載 module 的名稱。


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


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


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


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


          使用示例如下:

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

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

          如下示例,等價(jià)于 import os as myos:

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


          03?使用 importlib


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

          它的簡(jiǎn)單示例:

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

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

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


          04?使用 imp


          imp 模塊提供了一些 import 語(yǔ)句內(nèi)部實(shí)現(xiàn)的接口。例如模塊查找(find_module)、模塊加載(load_module)等等(模塊的導(dǎo)入過(guò)程會(huì)包含模塊查找、加載、緩存等步驟)。

          可以用該模塊來(lái)簡(jiǎn)單實(shí)現(xiàn)內(nèi)建的 __import__ 函數(shù)功能:

          >>> import imp>>> file, pathname, desc = imp.find_module('os')>>> myos = imp.load_module('sep', file, pathname, desc)>>> myos>>> myos.getcwd()'/home/wangbm'


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

          即從 Python 3.4 開(kāi)始,importlib 模塊是之前 imp 模塊和 importlib 模塊的合集。

          05?使用 execfile


          在 Python 2 中有一個(gè) execfile 函數(shù),利用它可以用來(lái)執(zhí)行一個(gè)文件。
          語(yǔ)法如下:

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

          參數(shù)有這么幾個(gè):
          • filename:文件名。

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

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




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


          06?使用 exec


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

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

          示例如下:

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


          07?import_from_github_com


          有一個(gè)包叫做 import_from_github_com,從名字上很容易得知,它是一個(gè)可以從 github 下載安裝并導(dǎo)入的包。

          為了使用它,你需要做的就是按照如下命令使用pip 先安裝它。

          $ python3 -m pip install import_from_github_com

          這個(gè)包使用了PEP 302中新的引入鉤子,允許你可以從github上引入包。這個(gè)包實(shí)際做的就是安裝這個(gè)包并將它添加到本地。

          你需要 Python 3.2 或者更高的版本,并且 git 和 pip 都已經(jīng)安裝才能使用這個(gè)包。

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

          $ python3 -m pip install --upgrade pip

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

          示例如下
          >>> from github_com.zzzeek import sqlalchemyCollecting git+https://github.com/zzzeek/sqlalchemyCloning https://github.com/zzzeek/sqlalchemy to /tmp/pip-acfv7t06-buildInstalling collected packages: SQLAlchemyRunning setup.py install for SQLAlchemy ... doneSuccessfully installed SQLAlchemy-1.1.0b1.dev0>>> locals(){'__builtins__': , '__spec__': None,'__package__': None, '__doc__': None, '__name__': '__main__','sqlalchemy': sqlalchemy/__init__.py'>,'__loader__': }>>>

          看了 import_from_github_com的源碼后,你會(huì)注意到它并沒(méi)有使用importlib。

          實(shí)際上,它的原理就是使用 pip 來(lái)安裝那些沒(méi)有安裝的包,然后使用Python的__import__()函數(shù)來(lái)引入新安裝的模塊。

          08?遠(yuǎn)程導(dǎo)入模塊



          示例代碼如下:
          # 新建一個(gè) py 文件(my_importer.py),內(nèi)容如下import sysimport importlibimport 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ù)器上開(kāi)啟 http 服務(wù)(為了方便,我僅在本地進(jìn)行演示),并且手動(dòng)編輯一個(gè)名為 my_info 的 python 文件,如果后面導(dǎo)入成功會(huì)打印 ok。

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

          一切準(zhǔn)備好,驗(yàn)證開(kāi)始。


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

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

          關(guān)注戀習(xí)Python,Python都好練


          好文章,我在看??

          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天堂网最新网址 | 女人18水真多毛片一级A片 | 天天日天天操天天射 | 俺去也俺就去www色情网最新更新内容 | 逼逼操操|