標籤:底線 com 變數 tps python3 packages build 例子 多個
概念: 在Python中,一個.py檔案就稱之為一個模組(Module)
好處:
1. 提高可維護性
2. 可重用
3. 避免函數名、變數名衝突。 每個模組有獨立的命名空間,因此相同名字的函數和變數完全可以分別存在不同的模組中。因此我們自己在編寫模組時,不必考慮名字會與其他模組衝突
模組種類:
1. 內建標準模組(標準庫)。執行help(‘modules’)查看所有Python內建模組列表
2. 第三方開源模組,可通過 pip install 模組名 連網安裝
3. 自訂模組
模組的匯入路徑:
模組調用:
import module # 整個模組都匯入
from module import xx # 從某個模組裡面匯入它的一個小模組, 如: from random import randint (這種方法匯入的模組用的時候直接:randint(x,x)就行,前面就不用再加random. , 因為你都沒有匯入random模組), 利用這種方法可以匯入多個小模組,中間加逗號(“ , ”)就行。
from module.xx.xx import xx as rename # 從模組的某個目錄下匯入某個小模組(或者是檔案夾的形式),如: from django.core import handlers 。 as rename是對匯入的模組在你這個程式中重新命名,如:import multiprocessing as mulpro 以後在你這個程式中利用 mulpro. 就行
from module.xx.xx import * # 從模組的目錄下匯入所有的小模組,以後調用小模組的時候就不用再在小模組前加大模組的首碼, 如: from socket import * 在你的程式裡調用socket的小模組時,直接寫小模組的名字就行, 前面不需要再加 socket. 。 注意: 不建議用這種方式匯入, 有可能這個小模組名跟你程式的變數名或者你匯入的其他模組的小模組名發生重名衝突。
註: 模組一旦被調用,就相當於執行了另一個py檔案裡的代碼, 如:
匯入自己寫的py檔案:
自己寫的 import練習.py 檔案內容如下:
def sayhi(cmd): print(‘hello‘,cmd)def saybye(cmd): print(‘bye‘,cmd)
匯入如下:
上面的 import練習.py 檔案如果改成:
def sayhi(cmd): print(‘hello‘,cmd)def saybye(cmd): print(‘bye‘,cmd)sayhi(‘abc‘)
import import練習.py這個檔案後,會直接列印“heoll,abc ”,因為調用這個模組就相當於把這個py檔案中的代碼從上到下走了一遍
從上面的匯入圖可以看出,我匯入的時候是專門進入到檔案所在的目錄去import的, 那是因為匯入的時候Python並不會去系統的全域去尋找你所匯入的檔案,如果你進入了某個目錄,它會在這個目錄中搜尋並匯入,如果你沒寫匯入目錄,它會去預設的路徑中去搜尋, 查看預設路徑的方法:
import syssys.path# 通過以上代碼會列印出它的預設搜尋路徑。# 我電腦的搜尋結果:# [‘‘, ‘D:\\python\\Lib\\idlelib‘, ‘D:\\python\\python36.zip‘, ‘D:\\python\\DLLs‘, ‘D:\\python\\lib‘, ‘D:\\python‘, ‘D:\\python\\lib\\site-packages‘, ‘D:\\python\\lib\\site-packages\\chardet-3.0.4-py3.6.egg‘] # 在這個列表中的路徑從左至右尋找,第一對引號下面表示是“目前的目錄”,所以預設是先從目前的目錄去找,如果目前的目錄沒找到,就往後依次找。 sys.path是個列表,你也可以自己利用sys.path.append()往裡面添加路徑,但你自己匯入的這個路徑只是在你這個程式裡面添加了,在其他程式裡面的sys.path裡面是沒有的,當你把這個程式關閉後,就不能利用你自己添加的那個路徑,也就是說這個路徑是一次性,只在你這個程式中有效。
# ‘D:\\python\\Lib\\idlelib‘, ‘D:\\python\\python36.zip‘
#‘D:\\python\\DLLs‘, ‘D:\\python\\lib‘, ‘D:\\python‘, # 這些是Python內建的安裝包相關的東西
# site-packages # 所有的標準庫,包括自己安裝的第三方庫
註:import module 是匯入到記憶體中了
開源模組安裝方式:
https://pypi.python.org/pypi 是Python的開源模組庫
安裝方式:
1. 手動安裝: 在cmd中進入所需安裝模組的目錄,在命令列輸入: python setup.py build
build成功後在命令列再輸入: python setup.py install
註:安裝在了Python的site-packages下
2. 連網安裝: pip install 模組名
3. 國內資源下載:
包:(Package)
當你的模組檔案越來越多,就需要對模組檔案進行劃分,比如把負責跟資料互動的都放在一個檔案夾中,把與頁面互動相關的放在一個檔案夾。
像上面這樣,一個檔案夾管理多個模組檔案,這個檔案夾就被稱為包。
假如我運行 manage.py並需要匯入crm檔案下的 views.py, 由於crm檔案跟 manage.py在檔案夾my_proj是同一層,可以如下匯入:
from crm import views # 所需要匯入的檔案在crm的多少層, 匯入的時候就在 crm後面加多少個點, 如: crm.xx.xx.xxxviews.xx()
以上是Python3的匯入方法。 Python2匯入自寫檔案夾時,需要在匯入的檔案夾中加上一個命名為“__init__.py ”(init兩邊各兩個底線, init是initiate(初始化)的縮寫)的空檔案,這樣自寫的檔案夾就變成了包。
就是說,Python2隻有在檔案夾中加入了“__inti__.py”這個空檔案,這個檔案夾才會變成包,但Python3加不加這個“__init__.py”空檔案都無所謂,但為了規範,最好加上。
啟動並執行 manage.py的時候匯入了 crm 下的 views.py , 如果views.py 又需要匯入 設定檔 my_proj 下的settings.py ,可以如下匯入:
from my_proj import settings # my_proj是設定檔settings.xx()# 正常來說, 由於views.py 和 setting.py 沒在同一個檔案夾中,也沒像manage.py和crm 在同一層級, 這樣匯入是不行的。 但由於 manage.py 在匯入 views.py 的時候,已經把 manage.py 所在的變數添加到了環境變數(即 os.path這個列表中的第一個元素)中,所以 這次匯入的時候,Python會搜尋 manage.py 所在路徑下的所有檔案(只會在manage.py這一層找)。 # 所以說, 把路徑添加到環境變數中的時候, 添加的是程式的主入口函數(即:manage.py)所在的路徑, 而跟匯入的模組(如: views.py)所在的位置、匯入檔案時進入了多少層沒有一點關係。
相對匯入:
cd.. 是返回上一層檔案夾
cd..\.. 是往上返回兩層 這個 .. 就是指相對路徑
還是上面的例子, manage.py 調用views.py, views.py 需要調用同目錄下的 models.py,在views.py中匯入models.py時不能這樣寫: import models 。 因為,主函數是 manage.py,所以只是manage.py 所在的路徑添加到了 os.path中了, 所以 Python只會在 manage.py這一層去尋找 models。所以,即使views.py和 models.py是在同一目錄下,也不能直接匯入。
匯入同一目錄下的py檔案,可以用以下寫法:
from . import module # from . 就表示目前的目錄下匯入。 這個 . 就叫做相對的匯入
在涉及到相對匯入時,package所對應的檔案夾必須正確的被Python解譯器視作package,而不是普通檔案夾。負責由於不被視作package,無法利用package之間的嵌套關係實現Python中包的相對匯入。
檔案夾被Python解譯器視作package需滿足兩個條件:
1. 檔案中必須有__inti__.py 檔案,該檔案可以為空白,但必須存在該檔案。
2. 該檔案夾中的py檔案不能作為頂層模組來執行(即不能作為主函數的入口)。 (相對匯入不能相對到了程式的根目錄)
註: 雖然Python支援相對匯入,但對模組間的路徑關係要求比較嚴格,處理不當就容易出錯,所以不建議在項目裡經常使用(form . 用的比較多一點,from .. 用的比較少)
Python模組基礎