Python3快速入門(四)——Python包管理
一、Python包簡(jiǎn)介
1、包
Python中使用包管理模塊,包通常對(duì)應(yīng)一個(gè)目錄,必須在目錄下創(chuàng)建一個(gè)
init
.py模塊,
init
.py模塊的模塊名稱即為包名,Python才會(huì)將目錄解析為包。
init
.py文件內(nèi)可以定義初始化包的內(nèi)容,導(dǎo)入包的內(nèi)容,限制包內(nèi)模塊的導(dǎo)出。
init
.py文件可以為空,也可以是一個(gè)模塊,其模塊名稱為包名稱。
導(dǎo)入包或包的模塊、變量、函數(shù)時(shí),
init
.py文件會(huì)被自動(dòng)執(zhí)行。
2、模塊
Python中一個(gè).py文件就是一個(gè)模塊。
Python 中用?import?或者?from...import?來(lái)導(dǎo)入相應(yīng)的模塊。
將整個(gè)模塊(somemodule)導(dǎo)入,格式為:?import somemodule
從某個(gè)模塊中導(dǎo)入某個(gè)函數(shù)或變量,格式為:?from somemodule import somefunction
從某個(gè)模塊中導(dǎo)入多個(gè)函數(shù),格式為:?from somemodule import firstfunc, secondfunc, thirdfunc
將某個(gè)模塊中的全部函數(shù)或變量導(dǎo)入,格式為:
?from somemodule import *
import sys
print('================Python import module==========================')
print('命令行參數(shù)為:')
for i in sys.argv:
print(i)
print("python 路徑為", sys.path)
from sys import argv, path # 導(dǎo)入特定的成員
print('================python from import===================================')
print(argv)
print(path)
對(duì)導(dǎo)入的模塊進(jìn)行重命名
Import package.module as name
import導(dǎo)入包或模塊時(shí),如果導(dǎo)入模塊較多需要換行,可以使用反斜杠,或是將使用小括號(hào)將包含所有的模塊。
包和模塊不會(huì)被重復(fù)導(dǎo)入。
3、模塊的內(nèi)置變量
模塊內(nèi)部預(yù)定義了內(nèi)置變量:
name
:當(dāng)前模塊名稱
package
:當(dāng)前模塊所屬包的名稱
doc
:當(dāng)前模塊的注釋內(nèi)容
file
:當(dāng)前文件
# -*- coding:utf-8 -*-
print("name: " + __name__)
print("package: " + (__package__ or "當(dāng)前模塊不屬于任何包"))
print("doc: " + (__doc__ or "當(dāng)前模塊沒有任何注釋"))
print("file: " + __file__)
# name: __main__
# package: 當(dāng)前模塊不屬于任何包
# doc: 當(dāng)前模塊沒有任何注釋
# file: test.py
如果某個(gè)文件被當(dāng)作入口文件,內(nèi)置變量
package
沒有值,
name
值為
main
,
doc
,
file
值為文件名稱(不含路徑)。
每個(gè)模塊都可以任意寫一些沒有縮進(jìn)的代碼,并且在載入時(shí)自動(dòng)執(zhí)行,為了區(qū)分模塊是主執(zhí)行文件還是被調(diào)用的模塊文件,Python引入了一個(gè)變量
name
,當(dāng)文件是被調(diào)用時(shí),
name
的值為模塊名,當(dāng)文件作為入口被執(zhí)行時(shí),
name
為'
main
'。因此,可以在每個(gè)模塊中寫上測(cè)試代碼,測(cè)試代碼僅當(dāng)模塊被Python直接執(zhí)行時(shí)才會(huì)運(yùn)行,代碼和測(cè)試結(jié)合在一起,完美實(shí)現(xiàn)對(duì)測(cè)試驅(qū)動(dòng)開發(fā)(TDD)的支持。
if __name__ == "__main__":
function_name()
將一個(gè)模塊文件作為模塊執(zhí)行而不是應(yīng)用執(zhí)行的命令如下:
python3 -m package.module
二、Python包管理
1、導(dǎo)入包和模塊
import只能導(dǎo)入包和模塊,不能直接導(dǎo)入變量或者函數(shù)。對(duì)于多層包嵌套后導(dǎo)致導(dǎo)入名稱過長(zhǎng),可以為其重命名。
import package1.package2.module_name
import package1
import package1.module_name
import package1.package2.module_name as new_name
導(dǎo)入包和模塊時(shí)需要避免循環(huán)導(dǎo)入,兩個(gè)或者多個(gè)模塊文件互相導(dǎo)入會(huì)報(bào)錯(cuò)。
Python在導(dǎo)入模塊時(shí),會(huì)執(zhí)行模塊里的所有內(nèi)容,但多次導(dǎo)入只會(huì)執(zhí)行一次。
Import導(dǎo)入包或模塊時(shí),Python 解釋器尋找模塊的優(yōu)先級(jí)如下:
A、當(dāng)前目錄
B、環(huán)境變量PYTHONPATH
C、sys.path(list 類型)
模塊在被導(dǎo)入執(zhí)行時(shí),Python解釋器為加快程序的啟動(dòng)速度,會(huì)在與模塊文件同一目錄下自動(dòng)生成.pyc文件,.pyc是經(jīng)過編譯后的字節(jié)碼。
Python使用縮進(jìn)對(duì)齊組織代碼的執(zhí)行,所有沒有縮進(jìn)的代碼(非函數(shù)定義和類定義),都會(huì)在載入時(shí)自動(dòng)執(zhí)行。
2、導(dǎo)入變量和函數(shù)
導(dǎo)入某個(gè)模塊的變量,多個(gè)使用逗號(hào)分隔
from package1.package2.module_name import variable_name
導(dǎo)入某個(gè)模塊的函數(shù),多個(gè)使用逗號(hào)分隔
from package1.package2.module_name import function_name
導(dǎo)入某個(gè)包的某個(gè)模塊,多個(gè)使用逗號(hào)分隔
from package1 import module_name
導(dǎo)入模塊的所有變量和函數(shù)
from package1.module_name import *
在模塊內(nèi)使用內(nèi)置
all
屬性指定本模塊可以導(dǎo)出的變量或函數(shù),外部導(dǎo)入只能使用指定的變量或函數(shù)。
在模塊(
*.py
)中使用導(dǎo)出
all
列表里的類、函數(shù)、變量等成員,否則將導(dǎo)出所有不以下劃線開頭(私有)的成員,在模塊中使用
all
屬性可避免在相互引用時(shí)的命名沖突。
#!/usr/bin/python3
__all__ = ["variable1", "variable2", "function_name1", "function_name2"]
variable1 = 0
variable2 = 0
def function_name1(args):
pass
def function_name2(args):
pass
在導(dǎo)入變量和函數(shù)時(shí),如果變量和函數(shù)太多需要換行,則可以使用反斜杠換行或是使用小括號(hào)修飾多個(gè)變量或函數(shù)。
from package1.module_name import variable1, variable2 \
variable3, function_name1
from package1.module_name import (variable1, variable2,
function_name2, function_name2)
3、頂級(jí)包
頂級(jí)包與入口文件 main.py 的位置有關(guān),與 main.py 同級(jí)的包是頂級(jí)包,因此main.py入口文件不屬于任何包。
4、相對(duì)導(dǎo)入
相對(duì)導(dǎo)入是導(dǎo)入模塊時(shí)指定被導(dǎo)入模塊名稱的相對(duì)路徑。
import 不支持相對(duì)導(dǎo)入,只能使用 from ... import ... 格式實(shí)現(xiàn)相對(duì)導(dǎo)入,
“ . ?.. ?... ” 來(lái)表示相對(duì)路徑,一個(gè)點(diǎn)表示當(dāng)前包,兩個(gè)點(diǎn)表示上一級(jí)包,以此類推。
入口文件中沒有包的概念,因此不能使用相對(duì)導(dǎo)入。
使用相對(duì)導(dǎo)入不要超出頂級(jí)包,入口文件同級(jí)的包都不能使用相對(duì)導(dǎo)入。
在main.py如果作為模塊執(zhí)行時(shí),可以使用相對(duì)導(dǎo)入,此時(shí)使用如下命令執(zhí)行:
python3 -m main.py
5、絕對(duì)導(dǎo)入
絕對(duì)導(dǎo)入是導(dǎo)入時(shí)必須指定從頂級(jí)包到被導(dǎo)入模塊名稱的完整路徑,可以使用import 和 from ... import ...進(jìn)行導(dǎo)入。
6、 init .py模塊
init
.py文件存在包的根目錄下,當(dāng)包或者包中的任意模塊或模塊中變量、函數(shù)被導(dǎo)入時(shí),
init
.py中內(nèi)容會(huì)首先自動(dòng)被執(zhí)行。因此,
init
.py文件可以實(shí)現(xiàn)如下應(yīng)用:
A、限制本包的模塊導(dǎo)入
在
init
.py中寫入內(nèi)置函數(shù)
all
,決定哪些模塊可以被外部導(dǎo)入。
__all__ = ["module_name1", "module_name2"]
B、批量導(dǎo)入
如果包內(nèi)多個(gè)模塊文件都需要用到某些模塊文件時(shí),可以在包的
init
.py文件中導(dǎo)入需要的模塊文件,然后就可以在本包不同的模塊文件中直接使用導(dǎo)入的模塊 。
三、Python項(xiàng)目結(jié)構(gòu)
1、Python文件結(jié)構(gòu)
通常,Python文件結(jié)構(gòu)如下:
#!/usr/bin/python3
# 模塊文檔
"""
This is an example.
"""
# 模塊導(dǎo)入
import sys
import os
# 定義全局變量
debug = True
# 定義類
class class_name:
pass
# 定義函數(shù)
def function_name():
pass
# 主程序
if __name__ == "__main__":
function_name()
2、Python項(xiàng)目目錄結(jié)構(gòu)
通常,Python項(xiàng)目的目錄結(jié)構(gòu)如下:
README:項(xiàng)目說(shuō)明文檔。
bin(scripts):存放項(xiàng)目的可執(zhí)行腳本。
project_name:存放項(xiàng)目的所有源代碼,程序的入口文件最好命名為main.py。
docs: 存放項(xiàng)目文檔。
tests:測(cè)試代碼目錄。
extras:項(xiàng)目擴(kuò)展部分,不屬于項(xiàng)目必需的部分,存放與項(xiàng)目相關(guān)的sample、poc,通常子目錄如下dev_example、production_example、test1_poc、test2_poc。
setup.py:項(xiàng)目安裝、部署、打包的腳本。
requirements.txt:存放軟件依賴的外部Python包列表。
README:項(xiàng)目說(shuō)明文件。
LICENSE.txt:版權(quán)聲明
ChangeLog.txt:版本變更日志記錄
AUTHORS:作者清單
INSTALL:安裝說(shuō)明
MANIFEST.in:裝箱清單文件
MAKEFILE:編譯腳本
四、pipenv包管理工具
1、pipenv簡(jiǎn)介
Python項(xiàng)目開發(fā)中,在開發(fā)需求完成并測(cè)試好后,需要發(fā)布到正式服務(wù)器,此時(shí)會(huì)面臨環(huán)境依賴問題。Python項(xiàng)目可能會(huì)有多個(gè)第三方模塊包,并且可能會(huì)有版本約束問題,因此需要一個(gè)虛擬環(huán)境,在虛擬環(huán)境里面模擬出跟服務(wù)器相同的環(huán)境。
pipenv ,全稱為Python Development Workflow for Humans,旨在為開發(fā)項(xiàng)目自動(dòng)創(chuàng)建和管理虛擬環(huán)境并管理 Python 包,是virtualenv 和pip的合集,通過創(chuàng)建指定python版本的虛擬環(huán)境和安裝依賴包,提供各個(gè)項(xiàng)目隔離的開發(fā)環(huán)境。
2、pipenv安裝
對(duì)于Python3,安裝命令如下:
pip3?install?pipenv
安裝結(jié)果查看:
pipenv?–version
3、pipenv常用命令
pipenv?--three
pipenv?--?two
pipenv --python 3.x.x
pipenv --python 2.x.x
創(chuàng)建虛擬環(huán)境,并指定Python版本
pipenv shell從系統(tǒng)環(huán)境切換到虛擬環(huán)境
pipenv install xxxx在虛擬環(huán)境安裝軟件包
exit退出虛擬環(huán)境
pipenv uninstall [module_name] 刪除Python包
pipenv --rm刪除虛擬環(huán)境
pipenv --where 列出本地工程路徑
pipenv --venv 列出虛擬環(huán)境路徑
pipenv --py 列出虛擬環(huán)境的Python可執(zhí)行文件
pipenv install 創(chuàng)建虛擬環(huán)境
pipenv install [moduel] 安裝包
pipenv install [moduel] --dev 安裝包到開發(fā)環(huán)境
pipenv uninstall [module] 卸載包
pipenv graph 查看包依賴
pipenv lock 生成lockfile
pipenv run python [pyfile] 運(yùn)行py文件
pipenv uninstall --all?卸載全部包并從Pipfile中移除
4、更換源
pipenv默認(rèn)的Pipfile?文件中指定使用官方源鎖定依賴,會(huì)導(dǎo)致速度過慢,解決方案自然是更換國(guó)內(nèi)源,常用國(guó)內(nèi)源如下:
阿里云:http://mirrors.aliyun.com/pypi/simple/
清華大學(xué):https://pypi.tuna.tsinghua.edu.cn/simple/
中國(guó)科學(xué)技術(shù)大學(xué):https://pypi.mirrors.ustc.edu.cn/simple/
源更換需要將Pipfile?文件中url的值替換為國(guó)內(nèi)源。
[[source]]
name = "pypi"
url = "http://mirrors.aliyun.com/pypi/simple/ "
verify_ssl = true
[dev-packages]
[packages]
pymysql = "*"
pymango = "*"
mysql-connector = "*"
mysqldb = "*"
mysql-python = "*"
[requires]
python_version = "3.7"
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
