python模塊和包,項目結(jié)構(gòu)

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)如下:

image.png

最簡單的情況下,只需要一個空的 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使用

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變量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容