Python在處理功能復(fù)用和功能顆粒度劃分時采用了類、模塊、包的結(jié)構(gòu)。
模塊
模塊,在Python可理解為對應(yīng)于一個文件。在創(chuàng)建了一個腳本文件后,定義了某些函數(shù)和變量。你在其他需要這些功能的文件中,導(dǎo)入這模塊,就可重用這些函數(shù)和變量。一般用module_name.fun_name,和module_name.var_name進(jìn)行使用。這樣的語義用法使模塊看起來很像類或者命名空間
模塊分為三種:
- 自定義模塊
- 內(nèi)置標(biāo)準(zhǔn)模塊
- 開源模塊(第三方)
模塊屬性__name__:
值由Python解釋器設(shè)定。如果腳本文件是作為主程序調(diào)用,其值就設(shè)為main,如果是作為模塊被其他文件導(dǎo)入,它的值就是其文件名。
#moduel1.py
def say(word):
print word]
#caller.py
import module1
print __name__
print module1.__name__
module1.say('hello')
>>>>
__main__
module1
hello
模塊搜索路徑
Python import module 的搜索路徑由sys.path指定,實質(zhì)為一個列表,列表索引先后決定搜索優(yōu)先級。
sys.path列表優(yōu)先級排序:
第一優(yōu)先級為當(dāng)前執(zhí)行腳本的目錄
第二優(yōu)先級為PYTHONPATH;
第三優(yōu)先級為安裝位置。
通過函數(shù)添加自編譯的模塊
- sys.path.append(PATH/filename) 加在sys.path的最后
- sys.path.insert(0,PATH/filename) 加在sys.path的最前
其實增加自編譯的模塊較為官方的方法是通過.pth文件添加:
Ubuntu第三方模塊目錄名為:dist-packages
Windows和Redhat第三方模塊目錄名為:site-packages
在site-packages/ dist-packages添加一個路徑文件,如mypkpath.pth,必須以.pth為后綴,寫上你要加入的模塊文件所在的目錄名稱就是了。
導(dǎo)入模塊四種方法
import module1,module2
from 模塊名 import 函數(shù)名
from 模塊名 import 函數(shù)名 as 函數(shù)別名
import 模塊名 as 函數(shù)別名
包
包名的 命名方式 和變量名一致,小寫字母 + _
如果您將一個或多個模塊放在 文件中,那么您有一個包。簡而言之,包本質(zhì)上是一個包含代碼的文件夾。包實際上只是一個目錄,但是所有包都必須包含一個__init__.py 文件。該文件告訴Python將目錄視為包含包
常見的包結(jié)構(gòu)如下:

最簡單的情況下,只需要一個空的 init.py 文件即可。
導(dǎo)入包的方法:
import 包名.模塊名
from 包名 import 模塊名
import 包名(注意__init__.py函數(shù)的內(nèi)容)
注意: 第一種 from 包名 import 模塊名,不用在包里的__init__寫入 import 模塊名
pip 安裝第三方模塊
第三方模塊 通常是指由 知名的第三方團(tuán)隊 開發(fā)的 并且被 程序員廣泛使用 的 Python 包 / 模塊
pip 是一個現(xiàn)代的,通用的 Python 包管理工具
提供了對 Python 包的查找、下載、安裝、卸載等功能安裝和卸載命令如下:
# 將模塊安裝到 Python 2.x 環(huán)境
$ sudo pip install pygame
$ sudo pip uninstall pygame
# 將模塊安裝到 Python 3.x 環(huán)境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame
發(fā)布模塊
如果希望自己開發(fā)的模塊,分享 給其他人,可以按照以下步驟操作:
1. 創(chuàng)建 setup.py
-
setup.py的文件
安裝、部署、打包的腳本。在 setup.py 文件中寫明依賴的庫和版本,以便到目標(biāo)機器上能夠使用python setup.py install安裝。
from distutils.core import setup
setup(name="hm_message", # 包名
version="1.0", # 版本
description="itheima's 發(fā)送和接收消息模塊", # 描述信息
long_description="完整的發(fā)送和接收消息模塊", # 完整描述信息
author="itheima", # 作者
author_email="itheima@itheima.com", # 作者郵箱
url="www.itheima.com", # 主頁
py_modules=["hm_message.send_message",
"hm_message.receive_message"])
有關(guān)字典參數(shù)的詳細(xì)信息,可以參閱官方網(wǎng)站:https://docs.python.org/2/distutils/apiref.html
2. 構(gòu)建模塊
$ python3 setup.py build
3. 生成發(fā)布壓縮包
$ python3 setup.py sdist
注意:要制作哪個版本的模塊,就使用哪個版本的解釋器執(zhí)行!
結(jié)構(gòu)說明
推薦結(jié)構(gòu)參考
項目結(jié)構(gòu)
對于開發(fā)人員而言,可以遵循一系列準(zhǔn)則,以確保為每個項目形成良好的結(jié)構(gòu)。這創(chuàng)造了一種通常被大多數(shù)程序員接受的通用方法。這樣做的好處是每個人都學(xué)會按照這些指導(dǎo)方針工作,從而消除了在查看人員項目時可能發(fā)生的許多混亂。
myproject(項目名)/
__init__.py該文件告訴Python將目錄視為包含包
__main__.py寫主要邏輯
test/一個常犯的錯誤是將單元測試部分代碼放在包目錄的外面。這些測試實際上應(yīng)該被包含在軟件的子包中自述文件 -擁有一段文本可以讓其他開發(fā)人員和潛在用戶受益。它還為開發(fā)人員提供了一種傳達(dá)程序特定內(nèi)容的方法,例如某個特性。README.rst /README.md
requirements.txt - 此文件列出項目所需的任何第三方依賴項。它讓其他人知道為了處理項目需要哪些庫。簡單來說,它是一個pip安裝要求列表。
示例:
Flask == 0.12
Jinja == 2.9.5
MarkupSafe == 0.23
Werkzeug == 0.11.15
argparse == 1.2.1
click == 6.7
wsgiref == 0.1.2
- setup.py - 安裝、部署、打包的腳本。在 setup.py 文件中寫明依賴的庫和版本,以便到目標(biāo)機器上能夠使用python setup.py install安裝。
- scripts/ 項目用到的各種腳本
下面這些頂層目錄也經(jīng)常出現(xiàn):
- docs/ 項目文檔 ,一般來說里面還包含config.py
- etc/ 用來存放配置文件的樣例
- tools/ 用來存放與工具有關(guān)的shell腳本
- bin/ 用來存放將被setup.py安裝的二進(jìn)制腳本
- data/ 用來存放其他類型的文件,如媒體文件
如果需要發(fā)行自己的模塊,那么頂層目錄還需要下面三個文件:
setup.cfg: 包含 setup.py 默認(rèn)命令選項的 ini 文件
LICENSE.txt 項目許可說明文件。--如果需要使用setuptools等工具進(jìn)打包發(fā)行, 那么需要一個許可文件。
MANIFEST.in:裝箱清單文件 ,當(dāng)需要打包源碼中不自動包含的附加文件時使用
快速生成項目結(jié)構(gòu)工具
這里介紹兩款工具: hatch、cookiecutter
cookiecutter使用
一、按流程生成項目
- 1、安裝
$ pip install --user cookiecutter
- 2、然后,克隆一個Cookiecutter項目模板:
# 按提示輸入內(nèi)容即可,可以去尋找相應(yīng)工程模板,如果Django項目結(jié)構(gòu)是 https://github.com/pydanny/cookiecutter-django
$ git clone https://github.com/audreyr/cookiecutter-pypackage.git
- 3、修改cookiecutter.json中定義的變量。然后生成你的項目打開骨架項目。如果您需要稍微更改它,請執(zhí)行此操作。
{
"full_name": "Audrey Roy Greenfeld",#版權(quán)所有者命名
"email": "644812368@qq.com",
"github_username": "LittleTrue", #項目模板作者名
"project_name": "Python SpiderTest", #項目名
"project_slug": "{{ cookiecutter.project_name.lower().replace(' ', '_').replace('-', '_') }}",
"project_short_description": "Python Boilerplate contains all the boilerplate you need to create a Python package.", #項目描述
"pypi_username": "{{ cookiecutter.github_username }}",
"version": "0.1.0", #項目版本
"use_pytest": "n",
"use_pypi_deployment_with_travis": "y",
"add_pyup_badge": "n",
"command_line_interface": [
"Click",
"No command-line interface"
],
"create_author_file": "y",
"open_source_license": [
"MIT license",
"BSD license",
"ISC license",
"Apache Software License 2.0",
"GNU General Public License v3",
"Not open source"
]
}
cookiecutter cookiecutter-pypackage/
二、直接生成項目
cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git
也可以直接使用上面命令代替上面2,3步, 不過生成項目時,系統(tǒng)將提示您輸入一組值,例如full_name,email和project_name。輸入您的信息,或者只需按返回/輸入即可接受默認(rèn)值。
此信息將用于填寫項目的空白。例如,您的姓名和年份將被放入LICENSE文件中。
三、cookiecutter-pypackage.git默認(rèn)樣本文件
AUTHORS.rst MANIFEST.in docs tox.ini
CONTRIBUTING.rst Makefile requirements.txt
HISTORY.rst README.rst setup.py
LICENSE boilerplate tests
這些文件對應(yīng)github.com:audreyr/cookiecutter-pypackage.git上文件名為{{cookiecutter.project_slug}}的目錄里的文件
四、定制私人項目模板
您可能還想創(chuàng)建一個repo,以不同的名稱命名,并將其作為您自己的新Cookiecutter項目模板推送,以方便將來使用
定制自己的項目模板帶github或本地,是更高級的學(xué)習(xí)
參考
使用問題
1、構(gòu)建時設(shè)置的cookiecutter.json中的值會在構(gòu)建時按ENTER當(dāng)成默認(rèn)值
2、如果cookiecutter命令失效,需要配環(huán)境變量 ,把C:\Users\LittleTrue\AppData\Roaming\Python\Python37\Scripts 加入系統(tǒng)Path變量