python中的包和模塊是兩個(gè)不同的概念飘诗,模塊是具有某一個(gè)特定功能的代碼塊教藻,而包就是模塊的集合墓捻。用import來調(diào)用包和模塊。
python中的包和模塊交煞,首先是按照代碼的功能進(jìn)行整理整合咏窿,將相似功能的代碼/大量代碼 整理到一起 方便統(tǒng)一管理
模塊(module):python中每個(gè)python文件就是一個(gè)模塊(模塊名稱就是文件名稱),每個(gè)python文件中素征,封裝類似功能的變量集嵌、函數(shù)、類型等等御毅,可以被其他的python模塊通過import關(guān)鍵字引入重復(fù)使用根欧!
包(pakcage)(文件夾):包含多個(gè)python文件/模塊的文件夾,并且文件夾中有一個(gè)名稱為init.py的特殊聲明文件端蛆,那么這個(gè)文件夾就是一個(gè)包(模塊包)凤粗,可以將大量功能相關(guān)的python模塊包含起來統(tǒng)一管理,同樣也可以被其他模塊通過import關(guān)鍵字引入重復(fù)使用封裝的模塊和代碼今豆!
?具體的調(diào)用方法有兩個(gè):1.import直接加包或者模塊的名字
2.是通過from調(diào)用
第一種方法就不再過多解釋重點(diǎn)說一下第二種方法:
1.from . import xxx # 從當(dāng)前模塊路徑下嫌拣,引入xxx模塊
2.from .. import xxx # 從當(dāng)前模塊的父級(jí)路徑下,引入xxx模塊
3.from pkg import module # 從 pkg包中引入一個(gè)模塊module
4.from pkg.module import vars, func, clazz# 從指定的模塊中直接引入
REMARK:from xx import 語法方式呆躲,主要是針對(duì)出現(xiàn)了包結(jié)構(gòu)的python代碼而特定的代碼引入方式异逐,首先要非常明確代碼的組織結(jié)構(gòu)才能正確使用from import語法進(jìn)行代碼的引入和復(fù)用
REMARK2:通過上述代碼,可以看到form import語法區(qū)分為兩種操作
使用了./..的相對(duì)路徑的引入操作方式
直接使用包/模塊名稱的絕對(duì)引入操作方式
1.2.2.from import 相對(duì)引入
首先歼秽,相對(duì)引入本身是相對(duì)當(dāng)前正在操作的文件的路徑
同一級(jí)路徑使用符號(hào):.
上一級(jí)路徑使用符號(hào):..
創(chuàng)建測(cè)試項(xiàng)目文件夾demo02/
項(xiàng)目中創(chuàng)建一個(gè)工具模塊:utils.py
# coding:utf-8
# 測(cè)試變量
test_msg = “hello”
# 測(cè)試函數(shù)
def test_func():
print(“test 函數(shù)操作”)
# 測(cè)試類型
class Test:
pass
項(xiàng)目中創(chuàng)建主測(cè)試模塊:main.py
# 模塊的相對(duì)引入
from . import utils
# 測(cè)試變量
print(utils.test_msg)
# 測(cè)試函數(shù)
utils.test_func()
# 測(cè)試類型
t = utils.Test()
包的引入可以通過相對(duì)路徑直接操作应役,這里的demo02/可以是python的包情组,也可以是一個(gè)普通包含
python代碼的文件夾燥筷。
但是需要注意的是,一旦使用相對(duì)路徑院崇,就要明確所謂相對(duì)路徑~是依賴他們所屬的父級(jí)文件夾確定的肆氓,
就類似生活中的兄弟姐妹的稱謂一樣,是相對(duì)他們的父親來說的底瓣,所以運(yùn)行代碼需要在demo02/文件夾
所在路徑谢揪,執(zhí)行如下命令運(yùn)行
# 命令行執(zhí)行運(yùn)行代碼的命令蕉陋,告訴python解釋器在執(zhí)行指定路徑中的python代碼
python –m demo02.main
REMARK:如果直接在demo02/文件夾中,執(zhí)行命令
python main.py 就會(huì)出現(xiàn)如下錯(cuò)誤
ImportError:cannot import name ‘utils’
1.2.3.from import 絕對(duì)引入
絕對(duì)引入操作方式比較直接拨扶,從最外層的包的源頭直接開始操作凳鬓;
如:from pygame import K_A, K_S, K_D, K_W
這種操作方式在第三方模塊的操作中是司空見慣的,但是在獨(dú)立的項(xiàng)目開發(fā)中使用較少患民!
還是上面那個(gè)案例操作缩举,修改main.py代碼如下:
# 相對(duì)引入操作
# from . import utils
# 絕對(duì)引入操作
from demo02 import utils
# 使用utils中的變量、函數(shù)匹颤、類型等等..
運(yùn)行操作方式當(dāng)然和前面講過的類似仅孩,既然你確定了項(xiàng)目是從demo02/為最外層文件夾的話,那么
運(yùn)行也是參考demo02來執(zhí)行命令
python –m demo02.main
包:發(fā)布操作
?標(biāo)準(zhǔn)化構(gòu)建:將開發(fā)的代碼文件按照標(biāo)準(zhǔn)的格式進(jìn)行組織管理
?打包壓縮:將構(gòu)建好的代碼文件印蓖,打包壓縮到一個(gè)文件中辽慕,方便管理使用
?發(fā)布:將自己開發(fā)好的程序,經(jīng)過打包之后赦肃,發(fā)布到官方模塊管理標(biāo)準(zhǔn)網(wǎng)站中溅蛉!
?其他開發(fā)人員~在聯(lián)網(wǎng)的情況下:pip install 你的名字
1.5.1.本地發(fā)布
在我們已經(jīng)開發(fā)好的一個(gè)包文件夾下,創(chuàng)建一個(gè)python模塊:setup.py
模塊中定義如下內(nèi)容
# 引入構(gòu)建包信息的模塊
from distutils.core import setup
# 定義發(fā)布的包文件的信息
setup(
name=“damu_pkg01”, # 發(fā)布的包文件名稱
version=”1.0”, # 發(fā)布的包的版本序號(hào)
description=”我的測(cè)試包”, # 發(fā)布包的描述信息
author=”大牧莫邪”, # 發(fā)布包的作者信息
author_email=”damu@163.com”, # 作者聯(lián)系郵箱信息
py_modules=[‘__init__.py’,’..’,..]# 發(fā)布的包中的模塊文件列表
)
執(zhí)行當(dāng)前程序包文件的構(gòu)建操作命令:按照標(biāo)準(zhǔn)格式組織包中的所有數(shù)據(jù)文件
python setup.py build
REMARK:構(gòu)建完畢的文件
可以通過python setup.py install命令直接當(dāng)成第三方模塊進(jìn)行安裝
執(zhí)行命令進(jìn)行包的打包發(fā)布
python setup.py sdist
REMARK:打包的文件他宛,主要是方便進(jìn)行網(wǎng)絡(luò)傳輸温艇,打包之后會(huì)在dist中創(chuàng)建包含包中所有信息的
tar.gz壓縮包文件;該文件就可以通過git等方式提交給對(duì)應(yīng)的開源組織發(fā)布你的自定義模塊了堕汞!
在本地發(fā)布過之后勺爱,要是發(fā)布到網(wǎng)站上,就再執(zhí)行一條命令就可以了:
twine upload dist/*
執(zhí)行過這條命令后要是別的主機(jī)相使用這個(gè)模塊讯检,就可以直接在網(wǎng)站上下載琐鲁,網(wǎng)站是http://pypi.python.org/pypi。另外特別需要注意的是要是打包圖片或者M(jìn)P3文件時(shí)人灼,就需要在文件下添加一個(gè)文件MANIFEST.in围段,然后在文件里面添加:
recursive-include 圖片或MP3文件名稱 *
然后開始執(zhí)行發(fā)布操作。