Python中使用包管理模塊,包通常對(duì)應(yīng)一個(gè)目錄,必須在目錄下創(chuàng)建一個(gè)init.py模塊,init.py模塊的模塊名稱(chēng)即為包名,Python才會(huì)將目錄解析為包。
init.py文件內(nèi)可以定義初始化包的內(nèi)容,導(dǎo)入包的內(nèi)容,限制包內(nèi)模塊的導(dǎo)出。
init.py文件可以為空,也可以是一個(gè)模塊,其模塊名稱(chēng)為包名稱(chēng)。
導(dǎo)入包或包的模塊、變量、函數(shù)時(shí),init.py文件會(huì)被自動(dòng)執(zhí)行。
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)入。
模塊內(nèi)部預(yù)定義了內(nèi)置變量:
name:當(dāng)前模塊名稱(chēng)
package:當(dāng)前模塊所屬包的名稱(chē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)前模塊沒(méi)有任何注釋"))
print("file: " + __file__)
# name: __main__
# package: 當(dāng)前模塊不屬于任何包
# doc: 當(dāng)前模塊沒(méi)有任何注釋
# file: test.py
如果某個(gè)文件被當(dāng)作入口文件,內(nèi)置變量package沒(méi)有值,name值為main,doc,file值為文件名稱(chēng)(不含路徑)。
每個(gè)模塊都可以任意寫(xiě)一些沒(méi)有縮進(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è)模塊中寫(xiě)上測(cè)試代碼,測(cè)試代碼僅當(dāng)模塊被Python直接執(zhí)行時(shí)才會(huì)運(yùn)行,代碼和測(cè)試結(jié)合在一起,完美實(shí)現(xiàn)對(duì)測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)的支持。
if __name__ == "__main__":
function_name()
將一個(gè)模塊文件作為模塊執(zhí)行而不是應(yīng)用執(zhí)行的命令如下:python3 -m package.module
import只能導(dǎo)入包和模塊,不能直接導(dǎo)入變量或者函數(shù)。對(duì)于多層包嵌套后導(dǎo)致導(dǎo)入名稱(chēng)過(guò)長(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 類(lèi)型)
模塊在被導(dǎo)入執(zhí)行時(shí),Python解釋器為加快程序的啟動(dòng)速度,會(huì)在與模塊文件同一目錄下自動(dòng)生成.pyc文件,.pyc是經(jīng)過(guò)編譯后的字節(jié)碼。
Python使用縮進(jìn)對(duì)齊組織代碼的執(zhí)行,所有沒(méi)有縮進(jìn)的代碼(非函數(shù)定義和類(lèi)定義),都會(huì)在載入時(shí)自動(dòng)執(zhí)行。
導(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列表里的類(lèi)、函數(shù)、變量等成員,否則將導(dǎo)出所有不以下劃線開(kāi)頭(私有)的成員,在模塊中使用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)
頂級(jí)包與入口文件 main.py 的位置有關(guān),與 main.py 同級(jí)的包是頂級(jí)包,因此main.py入口文件不屬于任何包。
相對(duì)導(dǎo)入是導(dǎo)入模塊時(shí)指定被導(dǎo)入模塊名稱(chēng)的相對(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í)包,以此類(lèi)推。
入口文件中沒(méi)有包的概念,因此不能使用相對(duì)導(dǎo)入。
使用相對(duì)導(dǎo)入不要超出頂級(jí)包,入口文件同級(jí)的包都不能使用相對(duì)導(dǎo)入。
在main.py如果作為模塊執(zhí)行時(shí),可以使用相對(duì)導(dǎo)入,此時(shí)使用如下命令執(zhí)行:python3 -m main.py
絕對(duì)導(dǎo)入是導(dǎo)入時(shí)必須指定從頂級(jí)包到被導(dǎo)入模塊名稱(chēng)的完整路徑,可以使用import 和 from ... import ...進(jìn)行導(dǎo)入。
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中寫(xiě)入內(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文件結(jié)構(gòu)如下:
#!/usr/bin/python3
# 模塊文檔
"""
This is an example.
"""
# 模塊導(dǎo)入
import sys
import os
# 定義全局變量
debug = True
# 定義類(lèi)
class class_name:
pass
# 定義函數(shù)
def function_name():
pass
# 主程序
if __name__ == "__main__":
function_name()
通常,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:存放軟件依賴(lài)的外部Python包列表。
README:項(xiàng)目說(shuō)明文件。
LICENSE.txt:版權(quán)聲明
ChangeLog.txt:版本變更日志記錄
AUTHORS:作者清單
INSTALL:安裝說(shuō)明
MANIFEST.in:裝箱清單文件
MAKEFILE:編譯腳本
Python項(xiàng)目開(kāi)發(fā)中,在開(kāi)發(fā)需求完成并測(cè)試好后,需要發(fā)布到正式服務(wù)器,此時(shí)會(huì)面臨環(huán)境依賴(lài)問(wèn)題。Python項(xiàng)目可能會(huì)有多個(gè)第三方模塊包,并且可能會(huì)有版本約束問(wèn)題,因此需要一個(gè)虛擬環(huán)境,在虛擬環(huán)境里面模擬出跟服務(wù)器相同的環(huán)境。
pipenv ,全稱(chēng)為Python Development Workflow for Humans,旨在為開(kāi)發(fā)項(xiàng)目自動(dòng)創(chuàng)建和管理虛擬環(huán)境并管理 Python 包,是virtualenv 和pip的合集,通過(guò)創(chuàng)建指定python版本的虛擬環(huán)境和安裝依賴(lài)包,提供各個(gè)項(xiàng)目隔離的開(kāi)發(fā)環(huán)境。
對(duì)于Python3,安裝命令如下:
pip3?install?pipenv
安裝結(jié)果查看:
pipenv?–version
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 安裝包到開(kāi)發(fā)環(huán)境
pipenv uninstall [module] 卸載包
pipenv graph 查看包依賴(lài)
pipenv lock 生成lockfile
pipenv run python [pyfile] 運(yùn)行py文件
pipenv uninstall --all?卸載全部包并從Pipfile中移除
pipenv默認(rèn)的Pipfile?文件中指定使用官方源鎖定依賴(lài),會(huì)導(dǎo)致速度過(guò)慢,解決方案自然是更換國(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"
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站題目:Python3快速入門(mén)(四)——Python包管理-創(chuàng)新互聯(lián)
鏈接地址:http://jinyejixie.com/article32/djedpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、微信公眾號(hào)、服務(wù)器托管、定制開(kāi)發(fā)、ChatGPT、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容