摘要:標準模塊附帶了一個標準模塊庫。它返回一個如果調用不傳遞參數,則列出當前已經定義的所有名字用可以查看所有的內置類型變量函數等,方法是借助標準模塊模塊高級技巧總結的搜索路徑,順序一定要搞得清編譯后的文件內置函數查看模塊定義的名字。
上一節,我們講解了Python模塊的基礎知識,這一節我們繼續深入了解模塊的更多知識,從而讓大家全面了解、掌握和運用模塊到我們實際的編程中。
在上一節中有一句話“接著我們在這個文件所在目錄運行Python解釋器IPython”,不知道大家還記不記得。這就話背后隱含的意思是,在這個文件(模塊)目錄下,我們才可以import到這個模塊,否則會報錯,說找不到這個模塊。這里,就涉及到了Python模塊的搜索路徑。
Python模塊的搜索路徑當一個名為mylib的模塊被導入時,解釋器首先搜索內置模塊是不是有該名字的模塊。
如果沒有找到,接著搜索sys.path列出的目錄下面是不是有名為mylib的模塊。
sys.path的初始化按以下幾個路徑的順序:
**(1)包含輸入腳本的目錄,如果沒有輸入腳本則是當前目錄;
(2)環境變量PYTHONPATH(一個目錄名稱的列表);
(3)Python庫的安裝目錄。**
下面我們來驗證一下sys.path所包含的路徑,編寫一個Python文件initpath.py如下:
# Author: veelion # file: initpath.py import sys print(" ".join(sys.path))
命令行下運行:python3 initpath.py得到如下結果:
$ 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
我們可以發現,initpath.py所在的目錄是sys.path列表的第一個元素。符合上面三條原則的順序。
接下來我們通過交互式Python解釋器來看看sys.path,運行CPython解釋器再導入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"]
細心的小猿可以發現,sys.path的第一項是個空字符串,和運行腳本方式下的第一項——當前路徑不一樣。為什么會是空字符串呢?
這是因為,當交互式運行Python解釋器時(或者腳本是從標注輸入讀取的),可以認為傳給解釋器的腳本文件路徑為空,那么就把sys.path[0]設置為空字符串,它告訴Python搜索模塊時先從當前文件夾開始。
以上兩種方法驗證的sys.path都符合預期,然而IPython有點例外。
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 并沒有把當前路徑放在第一項。這樣就會導致你寫的模塊與系統模塊重名時,它import的是系統模塊而不是你寫的模塊,而前面兩種方式就是導入你寫的模塊而非系統模塊。這一點在使用IPython時要格外注意。
注意你可以在程序中修改sys.path。sys.path是一個Python的列表結構,我們可以像修改列表那樣修改它,增加、刪除、修改路徑順序。比如,可以通過sys.path.insert(0, "my-module-path")來把我們自己寫的模塊的路徑放到搜索路徑的最前面,優先搜索自己的模塊。
編譯后的Python文件:*pyc為了加速模塊的加載時間,Python會緩存已經編譯好的模塊,并把它們放在與模塊同級目錄下的__pycache__文件夾下面,編譯好的模塊的命名方式為:module.version.pyc,其中的version包含Python的版本號。比如:
$ ls __pycache__/ m1.cpython-36.pyc m2.cpython-36.pyc
cpython-36就是編譯這個模塊的Python信息:用CPython 3.6 進行編譯的。這種命名方式方便不同版本的Python編譯的模塊同時存在而不造成沖突。
Python在兩種情況下不檢查緩存。
其一,它總是重新編譯并且不存儲直接從命令行加載的模塊的結果。
其二,如果沒有模塊源碼文件,它不會檢查緩存。要支持非源(僅編譯)分發,已編譯的模塊必須位于源碼目錄中,并且不得有模塊源碼。
舉個例子理解一下這兩點:
(1)如果在命令行下運行python m1.py,Python總是從新編譯m1.py,但不會保存pyc文件,因為每次都有重新編譯就沒必要保存了。
(2)如果我們導入m1模塊時,搜索路徑目錄下只有m1.pyc而沒有m1.py文件,那就直接導入m1.pyc。這種方式適合把編譯好的pyc發布給其他人而不是給它們源代碼,使用這種方式時,把.pyc文件從__pycache__中拷貝到.py文件相同的目錄下并刪掉.py文件即可。
(1)模塊compileall可以把一個文件夾下所有的py文件編譯成.pyc文件。
它的使用很簡單,命令行運行的格式如下:
python -m compileall 文件夾或文件名
更多選項可以通過:python -m compileall -h查看。
(2)編譯成.pyc文件時,可以給Python命令兩個選項:-O和-OO,使得編譯后的文件更小。
-O?去除assert語句;
-OO?去除assert語句和__doc__ string。
根據情況來使用這兩個選項,用compileall編譯文件時加這個選項就是這樣子的:
python -O -m compileall 文件夾或文件名
生成的pyc文件名稱里面有opt-標簽,-O的標簽是opt-,-OO的標簽就是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文件都不會使程序運行得更快(不會提高運行速度)。但是,.pyc文件能使加載速度更快,因為少了編譯的過程。
Python標準模塊Python附帶了一個標準模塊庫。其中一些模塊內置在解釋器中,它們提供對不屬于語言核心但仍然內置的操作的訪問,以提高效率或提供對系統調用等操作系統原語的訪問。這些模塊的集合是一個配置選項,它也取決于底層平臺。例如,winreg模塊僅在Windows系統上提供。一個值得注意的模塊是sys,它內置于每個Python解釋器中。
Python的標注模塊會在我們今后的編程中不斷遇到和使用,具體的學習可以在今后用到時再學習。你需要記住的一點是:當你寫Python代碼需要某些基本功能時,一定要先找找看是否已經有標準模塊存在,是否已經有人寫好了包含這些功能的模塊,最后才要覺得自己要不要實現這些功能。
Python內置函數dir()dir()用來查看模塊里面定義的名字,包括:變量名,模塊名,函數名等等。
它返回一個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"]
如果調用dir()不傳遞參數,則列出當前已經定義的所有名字:
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()可以查看所有的內置類型、變量、函數等,方法是借助標準模塊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模塊高級技巧總結
(1)Python的搜索路徑,順序一定要搞得清;
(2)編譯后的.pyc文件;
(3)dir()內置函數查看模塊定義的名字。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43799.html
摘要:本文與大家分享一些編程語言的入門書籍,其中不乏經典。全書貫穿的主體是如何思考設計開發的方法,而具體的編程語言,只是提供一個具體場景方便介紹的媒介。入門入門容易理解而且讀起來幽默風趣,對于編程初學者和語言新手而言是理想的書籍。 本文與大家分享一些Python編程語言的入門書籍,其中不乏經典。我在這里分享的,大部分是這些書的英文版,如果有中文版的我也加上了。有關書籍的介紹,大部分截取自是官...
摘要:針對的初學者,從無到有的語言如何入門,主要包括了的簡介,如何下載,如何安裝,如何使用終端,等各種開發環境進行開發,中的語法和基本知識概念和邏輯,以及繼續深入學習的方法。 ...
摘要:學習筆記七數學形態學關注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學習筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現代方法基于區域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經到來了,總結過去的 2017,相信小伙們一定有很多收獲...
閱讀 877·2021-10-13 09:39
閱讀 3530·2021-09-26 10:16
閱讀 2860·2019-08-30 15:54
閱讀 1037·2019-08-30 14:22
閱讀 2885·2019-08-29 15:39
閱讀 3252·2019-08-27 10:52
閱讀 809·2019-08-26 13:59
閱讀 1702·2019-08-26 12:20