定義1:python中什麼是模塊? 答:模塊就是一個.py文件,每個以py做爲後綴的文件,都是一個模塊。python
定義2:Python中什麼是包? 答:包是一類特殊的模塊,他能包含其餘模塊,爲了更好的組織模塊而出現,稱爲包。須要注意的是,但願python認爲這個模塊是包的話,這個模塊必須包含一個名爲__init__.py的模塊。假設包名爲package,import package時,首先會執行—__init__.py中的內容app
《Python基礎教程》對於第十章「自帶電池」中對於模塊介紹的標題爲:函數
- 模塊是程序(表明導入模塊時會執行模塊的內容,至關於執行了一段程序)spa
- 模塊用於定義(表明能夠在模塊中定義變量和函數,能夠增強代碼重用)code
- 讓你的模塊可用(後面詳細講解,會有擴展,主要內容)blog
sys.path - 尋找模塊時的搜索路徑教程
python處理模塊有必定的機制,模塊的搜索路徑存儲在sys.path中,經過打印該變量,咱們能夠看到一些內容,例如個人是:ip
>>> import sys, pprint >>> pprint.pprint(sys.path) ['', 'D:\\anaconda\\python27.zip', 'D:\\anaconda\\DLLs', 'D:\\anaconda\\lib', 'D:\\anaconda\\lib\\plat-win', 'D:\\anaconda\\lib\\lib-tk', 'D:\\anaconda', 'D:\\anaconda\\lib\\site-packages', 'D:\\anaconda\\lib\\site-packages\\Sphinx-1.5.1-py2.7.egg', 'D:\\anaconda\\lib\\site-packages\\thrift-0.10.0-py2.7.egg', 'D:\\anaconda\\lib\\site-packages\\win32', 'D:\\anaconda\\lib\\site-packages\\win32\\lib', 'D:\\anaconda\\lib\\site-packages\\Pythonwin', 'D:\\anaconda\\lib\\site-packages\\setuptools-27.2.0-py2.7.egg']
每一個人的sys.path都不太相同,這取決於你的python安裝方式,因爲我是使用anaconda進行安裝的,因此不少路徑與anaconda相關。須要稍微強調的是開發
- lib和site-packages,通常的模塊都在這裏可以找到,使用pip進行安裝的時候,大多數也是進入site-packages目錄下。所以爲了讓你的模塊可用,能夠嘗試把你的模塊放在這些目錄下面。it
- 模塊的搜索過程是從sys.path中遍歷搜索是否存在該模塊,找到第一個就直接返回,所以同名模塊有可能在搜索過程當中被覆蓋。這也是爲何當前路徑老是在sys.path第一個位置的緣由。若是本地統計目錄定義了一個模塊,搜索時會第一個從本地搜索到。
導入自定義模塊的通常方法
除了專門開發python模塊的人,咱們在使用python時,不會把模塊都寫在sys.path中系統指定的那些位置,未免有些太麻煩了。咱們會有本身的working directory,全部的模塊都在這裏。如何在這種狀況下導入模塊。下面分幾種狀況進行分析。
個人本地文件結構:
- 導入同級目錄下的模塊
例如,從parent_module.py 中導入parent_module2.py,只須要 import parent_module2.py
# content in parent_module.py file name = 'parent_module' print 'I am', name import parent_module2 # content in parent_module2.py file name = 'parent_module2' print 'I am', name
執行 python parent_module.py 獲得:
PS E:\workspace_vs\import_test> python .\parent_module.py
I am parent_module
I am parent_module2
- 導入子級目錄下的模塊
也很簡單,例如從parent_module.py中導入pson_module.py,只須要 import parent_package.pson_module.py
# content in parent_module.py name = 'parent_module' print 'I am', name import parent_package.pson_module # content in parent_package.pson_module.py name = 'pson_module' print 'I am', name
執行 python parent_module.py 獲得:
PS E:\workspace_vs\import_test> python .\parent_module.py
I am parent_module
I am pson_module
- 導入父級目錄下的模塊
這個就有點意思了,先說正確的方式,爲了讓系統搜索到父級的模塊,首先須要找到父級目錄的地址,一行代碼sys.path.append('..')
可是注意:上面append('..')方法將上級目錄加入path中,可是這個上級是相對於誰呢?應該是python的working directory,因此想要保證正確執行須要直接python .\parent_module.py,而不能再其它路徑執行該文件
另外,執行一個python文件的時候,不管working directory是哪裏,都會把該python文件(模塊)所在的目錄添加在sys.path中的第一項。
後面重點在於講解relative import 和 absolute import
未完待續。。。