摘要:標(biāo)準(zhǔn)模塊附帶了一個標(biāo)準(zhǔn)模塊庫。它返回一個如果調(diào)用不傳遞參數(shù),則列出當(dāng)前已經(jīng)定義的所有名字用可以查看所有的內(nèi)置類型變量函數(shù)等,方法是借助標(biāo)準(zhǔn)模塊模塊高級技巧總結(jié)的搜索路徑,順序一定要搞得清編譯后的文件內(nèi)置函數(shù)查看模塊定義的名字。
上一節(jié),我們講解了Python模塊的基礎(chǔ)知識,這一節(jié)我們繼續(xù)深入了解模塊的更多知識,從而讓大家全面了解、掌握和運(yùn)用模塊到我們實(shí)際的編程中。
在上一節(jié)中有一句話“接著我們在這個文件所在目錄運(yùn)行Python解釋器IPython”,不知道大家還記不記得。這就話背后隱含的意思是,在這個文件(模塊)目錄下,我們才可以import到這個模塊,否則會報錯,說找不到這個模塊。這里,就涉及到了Python模塊的搜索路徑。
Python模塊的搜索路徑當(dāng)一個名為mylib的模塊被導(dǎo)入時,解釋器首先搜索內(nèi)置模塊是不是有該名字的模塊。
如果沒有找到,接著搜索sys.path列出的目錄下面是不是有名為mylib的模塊。
sys.path的初始化按以下幾個路徑的順序:
**(1)包含輸入腳本的目錄,如果沒有輸入腳本則是當(dāng)前目錄;
(2)環(huán)境變量PYTHONPATH(一個目錄名稱的列表);
(3)Python庫的安裝目錄。**
下面我們來驗(yàn)證一下sys.path所包含的路徑,編寫一個Python文件initpath.py如下:
# Author: veelion # file: initpath.py import sys print(" ".join(sys.path))
命令行下運(yùn)行:python3 initpath.py得到如下結(jié)果:
$ python mylib.py /home/veelion/p2/tutorial/md_Python/codes /home/veelion/.virtualenvs/py3.7/lib/python37.zip /home/veelion/.virtualenvs/py3.7/lib/python3.7 /home/veelion/.virtualenvs/py3.7/lib/python3.7/lib-dynload /usr/lib/python3.7 /home/veelion/.virtualenvs/py3.7/lib/python3.7/site-packages
我們可以發(fā)現(xiàn),initpath.py所在的目錄是sys.path列表的第一個元素。符合上面三條原則的順序。
接下來我們通過交互式Python解釋器來看看sys.path,運(yùn)行CPython解釋器再導(dǎo)入sys:
>>> import sys >>> sys.path ["", "/home/veelion/.virtualenvs/py3.7/lib/python37.zip", "/home/veelion/.virtualenvs/py3.7/lib/python3.7", "/home/veelion/.virtualenvs/py3.7/lib/python3.7/lib-dynload", "/usr/lib/python3.7", "/home/veelion/.virtualenvs/py3.7/lib/python3.7/site-packages"]
細(xì)心的小猿可以發(fā)現(xiàn),sys.path的第一項是個空字符串,和運(yùn)行腳本方式下的第一項——當(dāng)前路徑不一樣。為什么會是空字符串呢?
這是因?yàn)椋?dāng)交互式運(yùn)行Python解釋器時(或者腳本是從標(biāo)注輸入讀取的),可以認(rèn)為傳給解釋器的腳本文件路徑為空,那么就把sys.path[0]設(shè)置為空字符串,它告訴Python搜索模塊時先從當(dāng)前文件夾開始。
以上兩種方法驗(yàn)證的sys.path都符合預(yù)期,然而IPython有點(diǎn)例外。
In [1]: import sys In [2]: sys.path Out[2]: ["/home/veelion/.virtualenvs/py3.7/bin", "/home/veelion/.virtualenvs/py3.7/lib/python37.zip", "/home/veelion/.virtualenvs/py3.7/lib/python3.7", "/home/veelion/.virtualenvs/py3.7/lib/python3.7/lib-dynload", "/usr/lib/python3.7", "", "/home/veelion/.virtualenvs/py3.7/lib/python3.7/site-packages", "/home/veelion/.virtualenvs/py3.7/lib/python3.7/site-packages/IPython/extensions", "/home/veelion/.ipython"]
IPython 并沒有把當(dāng)前路徑放在第一項。這樣就會導(dǎo)致你寫的模塊與系統(tǒng)模塊重名時,它import的是系統(tǒng)模塊而不是你寫的模塊,而前面兩種方式就是導(dǎo)入你寫的模塊而非系統(tǒng)模塊。這一點(diǎn)在使用IPython時要格外注意。
注意你可以在程序中修改sys.path。sys.path是一個Python的列表結(jié)構(gòu),我們可以像修改列表那樣修改它,增加、刪除、修改路徑順序。比如,可以通過sys.path.insert(0, "my-module-path")來把我們自己寫的模塊的路徑放到搜索路徑的最前面,優(yōu)先搜索自己的模塊。
編譯后的Python文件:*pyc為了加速模塊的加載時間,Python會緩存已經(jīng)編譯好的模塊,并把它們放在與模塊同級目錄下的__pycache__文件夾下面,編譯好的模塊的命名方式為:module.version.pyc,其中的version包含Python的版本號。比如:
$ ls __pycache__/ m1.cpython-36.pyc m2.cpython-36.pyc
cpython-36就是編譯這個模塊的Python信息:用CPython 3.6 進(jìn)行編譯的。這種命名方式方便不同版本的Python編譯的模塊同時存在而不造成沖突。
Python在兩種情況下不檢查緩存。
其一,它總是重新編譯并且不存儲直接從命令行加載的模塊的結(jié)果。
其二,如果沒有模塊源碼文件,它不會檢查緩存。要支持非源(僅編譯)分發(fā),已編譯的模塊必須位于源碼目錄中,并且不得有模塊源碼。
舉個例子理解一下這兩點(diǎn):
(1)如果在命令行下運(yùn)行python m1.py,Python總是從新編譯m1.py,但不會保存pyc文件,因?yàn)槊看味加兄匦戮幾g就沒必要保存了。
(2)如果我們導(dǎo)入m1模塊時,搜索路徑目錄下只有m1.pyc而沒有m1.py文件,那就直接導(dǎo)入m1.pyc。這種方式適合把編譯好的pyc發(fā)布給其他人而不是給它們源代碼,使用這種方式時,把.pyc文件從__pycache__中拷貝到.py文件相同的目錄下并刪掉.py文件即可。
(1)模塊compileall可以把一個文件夾下所有的py文件編譯成.pyc文件。
它的使用很簡單,命令行運(yùn)行的格式如下:
python -m compileall 文件夾或文件名
更多選項可以通過:python -m compileall -h查看。
(2)編譯成.pyc文件時,可以給Python命令兩個選項:-O和-OO,使得編譯后的文件更小。
-O?去除assert語句;
-OO?去除assert語句和__doc__ string。
根據(jù)情況來使用這兩個選項,用compileall編譯文件時加這個選項就是這樣子的:
python -O -m compileall 文件夾或文件名
生成的pyc文件名稱里面有opt-標(biāo)簽,-O的標(biāo)簽是opt-,-OO的標(biāo)簽就是opt-2。比如:
$ ls -F -1 __pycache__/ m1.cpython-36.opt-1.pyc m1.cpython-36.opt-2.pyc m1.cpython-36.pyc
(3).pyc和.py文件都不會使程序運(yùn)行得更快(不會提高運(yùn)行速度)。但是,.pyc文件能使加載速度更快,因?yàn)樯倭司幾g的過程。
Python標(biāo)準(zhǔn)模塊Python附帶了一個標(biāo)準(zhǔn)模塊庫。其中一些模塊內(nèi)置在解釋器中,它們提供對不屬于語言核心但仍然內(nèi)置的操作的訪問,以提高效率或提供對系統(tǒng)調(diào)用等操作系統(tǒng)原語的訪問。這些模塊的集合是一個配置選項,它也取決于底層平臺。例如,winreg模塊僅在Windows系統(tǒng)上提供。一個值得注意的模塊是sys,它內(nèi)置于每個Python解釋器中。
Python的標(biāo)注模塊會在我們今后的編程中不斷遇到和使用,具體的學(xué)習(xí)可以在今后用到時再學(xué)習(xí)。你需要記住的一點(diǎn)是:當(dāng)你寫Python代碼需要某些基本功能時,一定要先找找看是否已經(jīng)有標(biāo)準(zhǔn)模塊存在,是否已經(jīng)有人寫好了包含這些功能的模塊,最后才要覺得自己要不要實(shí)現(xiàn)這些功能。
Python內(nèi)置函數(shù)dir()dir()用來查看模塊里面定義的名字,包括:變量名,模塊名,函數(shù)名等等。
它返回一個list:
In [5]: import my_first_module In [6]: dir(my_first_module) Out[6]: ["MY_NAME", "__builtins__", "__cached__", "__doc__", "__file__", "__loader__", "__name__", "__package__", "__spec__", "my_add", "my_print"]
如果調(diào)用dir()不傳遞參數(shù),則列出當(dāng)前已經(jīng)定義的所有名字:
In [1]: import my_first_module In [2]: dir() Out[2]: ["In", "Out", "_", "__", "___", "__builtin__", "__builtins__", "__doc__", "__loader__", "__name__", "__package__", "__spec__", "_dh", "_i", "_i1", "_i2", "_ih", "_ii", "_iii", "_oh", "exit", "get_ipython", "my_first_module", "quit"]
用dir()可以查看所有的內(nèi)置類型、變量、函數(shù)等,方法是借助標(biāo)準(zhǔn)模塊builtins:
>>> import builtins >>> dir(builtins) ["ArithmeticError", "AssertionError", "AttributeError", "BaseException", "BlockingIOError", "BrokenPipeError", "BufferError", "BytesWarning", "ChildProcessError", "ConnectionAbortedError", "ConnectionError", "ConnectionRefusedError", "ConnectionResetError", "DeprecationWarning", "EOFError", "Ellipsis", "EnvironmentError", "Exception", "False", "FileExistsError", "FileNotFoundError", "FloatingPointError", "FutureWarning", "GeneratorExit", "IOError", "ImportError", "ImportWarning", "IndentationError", "IndexError", "InterruptedError", "IsADirectoryError", "KeyError", "KeyboardInterrupt", "LookupError", "MemoryError", "ModuleNotFoundError", "NameError", "None", "NotADirectoryError", "NotImplemented", "NotImplementedError", "OSError", "OverflowError", "PendingDeprecationWarning", "PermissionError", "ProcessLookupError", "RecursionError", "ReferenceError", "ResourceWarning", "RuntimeError", "RuntimeWarning", "StopAsyncIteration", "StopIteration", "SyntaxError", "SyntaxWarning", "SystemError", "SystemExit", "TabError", "TimeoutError", "True", "TypeError", "UnboundLocalError", "UnicodeDecodeError", "UnicodeEncodeError", "UnicodeError", "UnicodeTranslateError", "UnicodeWarning", "UserWarning", "ValueError", "Warning", "ZeroDivisionError", "_", "__build_class__", "__debug__", "__doc__", "__import__", "__loader__", "__name__", "__package__", "__spec__", "abs", "all", "any", "ascii", "bin", "bool", "bytearray", "bytes", "callable", "chr", "classmethod", "compile", "complex", "copyright", "credits", "delattr", "dict", "dir", "divmod", "enumerate", "eval", "exec", "exit", "filter", "float", "format", "frozenset", "getattr", "globals", "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", "license", "list", "locals", "map", "max", "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", "print", "property", "quit", "range", "repr", "reversed", "round", "set", "setattr", "slice", "sorted", "staticmethod", "str", "sum", "super", "tuple", "type", "vars", "zip"]Python模塊高級技巧總結(jié)
(1)Python的搜索路徑,順序一定要搞得清;
(2)編譯后的.pyc文件;
(3)dir()內(nèi)置函數(shù)查看模塊定義的名字。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43799.html
摘要:本文與大家分享一些編程語言的入門書籍,其中不乏經(jīng)典。全書貫穿的主體是如何思考設(shè)計開發(fā)的方法,而具體的編程語言,只是提供一個具體場景方便介紹的媒介。入門入門容易理解而且讀起來幽默風(fēng)趣,對于編程初學(xué)者和語言新手而言是理想的書籍。 本文與大家分享一些Python編程語言的入門書籍,其中不乏經(jīng)典。我在這里分享的,大部分是這些書的英文版,如果有中文版的我也加上了。有關(guān)書籍的介紹,大部分截取自是官...
摘要:針對的初學(xué)者,從無到有的語言如何入門,主要包括了的簡介,如何下載,如何安裝,如何使用終端,等各種開發(fā)環(huán)境進(jìn)行開發(fā),中的語法和基本知識概念和邏輯,以及繼續(xù)深入學(xué)習(xí)的方法。 ...
摘要:學(xué)習(xí)筆記七數(shù)學(xué)形態(tài)學(xué)關(guān)注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學(xué)習(xí)筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現(xiàn)代方法基于區(qū)域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機(jī)制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運(yùn)行在之上。它通過編輯類工具,帶來了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...
閱讀 885·2021-10-13 09:39
閱讀 3535·2021-09-26 10:16
閱讀 2874·2019-08-30 15:54
閱讀 1050·2019-08-30 14:22
閱讀 2893·2019-08-29 15:39
閱讀 3259·2019-08-27 10:52
閱讀 816·2019-08-26 13:59
閱讀 1710·2019-08-26 12:20