python導入模塊總結與分析

定義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

未完待續。。。

相關文章
相關標籤/搜索