您好,登錄后才能下訂單哦!
Python中使用包管理模塊,包通常對應(yīng)一個目錄,必須在目錄下創(chuàng)建一個init.py模塊,init.py模塊的模塊名稱即為包名,Python才會將目錄解析為包。
init.py文件內(nèi)可以定義初始化包的內(nèi)容,導(dǎo)入包的內(nèi)容,限制包內(nèi)模塊的導(dǎo)出。
init.py文件可以為空,也可以是一個模塊,其模塊名稱為包名稱。
導(dǎo)入包或包的模塊、變量、函數(shù)時,init .py文件會被自動執(zhí)行。
Python中一個.py文件就是一個模塊。
Python 中用?import?或者?from...import?來導(dǎo)入相應(yīng)的模塊。
將整個模塊(somemodule)導(dǎo)入,格式為:?import somemodule
從某個模塊中導(dǎo)入某個函數(shù)或變量,格式為:?from somemodule import somefunction
從某個模塊中導(dǎo)入多個函數(shù),格式為:?from somemodule import firstfunc, secondfunc, thirdfunc
將某個模塊中的全部函數(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)
對導(dǎo)入的模塊進行重命名
Import package.module as name
import導(dǎo)入包或模塊時,如果導(dǎo)入模塊較多需要換行,可以使用反斜杠,或是將使用小括號將包含所有的模塊。
包和模塊不會被重復(fù)導(dǎo)入。
模塊內(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
如果某個文件被當(dāng)作入口文件,內(nèi)置變量package 沒有值,name 值為main,doc ,file 值為文件名稱(不含路徑)。
每個模塊都可以任意寫一些沒有縮進的代碼,并且在載入時自動執(zhí)行,為了區(qū)分模塊是主執(zhí)行文件還是被調(diào)用的模塊文件,Python引入了一個變量name,當(dāng)文件是被調(diào)用時,name的值為模塊名,當(dāng)文件作為入口被執(zhí)行時,name為'main'。因此,可以在每個模塊中寫上測試代碼,測試代碼僅當(dāng)模塊被Python直接執(zhí)行時才會運行,代碼和測試結(jié)合在一起,完美實現(xiàn)對測試驅(qū)動開發(fā)(TDD)的支持。
if __name__ == "__main__":
function_name()
將一個模塊文件作為模塊執(zhí)行而不是應(yīng)用執(zhí)行的命令如下:python3 -m package.module
import只能導(dǎo)入包和模塊,不能直接導(dǎo)入變量或者函數(shù)。對于多層包嵌套后導(dǎo)致導(dǎo)入名稱過長,可以為其重命名。
import package1.package2.module_name
import package1
import package1.module_name
import package1.package2.module_name as new_name
導(dǎo)入包和模塊時需要避免循環(huán)導(dǎo)入,兩個或者多個模塊文件互相導(dǎo)入會報錯。
Python在導(dǎo)入模塊時,會執(zhí)行模塊里的所有內(nèi)容,但多次導(dǎo)入只會執(zhí)行一次。
Import導(dǎo)入包或模塊時,Python 解釋器尋找模塊的優(yōu)先級如下:
A、當(dāng)前目錄
B、環(huán)境變量PYTHONPATH
C、sys.path(list 類型)
模塊在被導(dǎo)入執(zhí)行時,Python解釋器為加快程序的啟動速度,會在與模塊文件同一目錄下自動生成.pyc文件,.pyc是經(jīng)過編譯后的字節(jié)碼。
Python使用縮進對齊組織代碼的執(zhí)行,所有沒有縮進的代碼(非函數(shù)定義和類定義),都會在載入時自動執(zhí)行。
導(dǎo)入某個模塊的變量,多個使用逗號分隔from package1.package2.module_name import variable_name
導(dǎo)入某個模塊的函數(shù),多個使用逗號分隔from package1.package2.module_name import function_name
導(dǎ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屬性可避免在相互引用時的命名沖突。
#!/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ù)。
from package1.module_name import variable1, variable2 \
variable3, function_name1
from package1.module_name import (variable1, variable2,
function_name2, function_name2)
頂級包與入口文件 main.py 的位置有關(guān),與 main.py 同級的包是頂級包,因此main.py入口文件不屬于任何包。
相對導(dǎo)入是導(dǎo)入模塊時指定被導(dǎo)入模塊名稱的相對路徑。
import 不支持相對導(dǎo)入,只能使用 from ... import ... 格式實現(xiàn)相對導(dǎo)入,
“ . ?.. ?... ” 來表示相對路徑,一個點表示當(dāng)前包,兩個點表示上一級包,以此類推。
入口文件中沒有包的概念,因此不能使用相對導(dǎo)入。
使用相對導(dǎo)入不要超出頂級包,入口文件同級的包都不能使用相對導(dǎo)入。
在main.py如果作為模塊執(zhí)行時,可以使用相對導(dǎo)入,此時使用如下命令執(zhí)行:python3 -m main.py
絕對導(dǎo)入是導(dǎo)入時必須指定從頂級包到被導(dǎo)入模塊名稱的完整路徑,可以使用import 和 from ... import ...進行導(dǎo)入。
init.py文件存在包的根目錄下,當(dāng)包或者包中的任意模塊或模塊中變量、函數(shù)被導(dǎo)入時,init.py中內(nèi)容會首先自動被執(zhí)行。因此,init.py文件可以實現(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)多個模塊文件都需要用到某些模塊文件時,可以在包的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
# 定義類
class class_name:
pass
# 定義函數(shù)
def function_name():
pass
# 主程序
if __name__ == "__main__":
function_name()
通常,Python項目的目錄結(jié)構(gòu)如下:
README:項目說明文檔。
bin(scripts):存放項目的可執(zhí)行腳本。
project_name:存放項目的所有源代碼,程序的入口文件最好命名為main.py。
docs: 存放項目文檔。
tests:測試代碼目錄。
extras:項目擴展部分,不屬于項目必需的部分,存放與項目相關(guān)的sample、poc,通常子目錄如下dev_example、production_example、test1_poc、test2_poc。
setup.py:項目安裝、部署、打包的腳本。
requirements.txt:存放軟件依賴的外部Python包列表。
README:項目說明文件。
LICENSE.txt:版權(quán)聲明
ChangeLog.txt:版本變更日志記錄
AUTHORS:作者清單
INSTALL:安裝說明
MANIFEST.in:裝箱清單文件
MAKEFILE:編譯腳本
Python項目開發(fā)中,在開發(fā)需求完成并測試好后,需要發(fā)布到正式服務(wù)器,此時會面臨環(huán)境依賴問題。Python項目可能會有多個第三方模塊包,并且可能會有版本約束問題,因此需要一個虛擬環(huán)境,在虛擬環(huán)境里面模擬出跟服務(wù)器相同的環(huán)境。
pipenv ,全稱為Python Development Workflow for Humans,旨在為開發(fā)項目自動創(chuàng)建和管理虛擬環(huán)境并管理 Python 包,是virtualenv 和pip的合集,通過創(chuàng)建指定python版本的虛擬環(huán)境和安裝依賴包,提供各個項目隔離的開發(fā)環(huán)境。
對于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 安裝包到開發(fā)環(huán)境
pipenv uninstall [module] 卸載包
pipenv graph 查看包依賴
pipenv lock 生成lockfile
pipenv run python [pyfile] 運行py文件
pipenv uninstall --all?卸載全部包并從Pipfile中移除
pipenv默認的Pipfile?文件中指定使用官方源鎖定依賴,會導(dǎo)致速度過慢,解決方案自然是更換國內(nèi)源,常用國內(nèi)源如下:
阿里云:http://mirrors.aliyun.com/pypi/simple/
清華大學(xué):https://pypi.tuna.tsinghua.edu.cn/simple/
中國科學(xué)技術(shù)大學(xué):https://pypi.mirrors.ustc.edu.cn/simple/
源更換需要將Pipfile?文件中url的值替換為國內(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"
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。