python的項目結構


項目結構

知識點

  • 創建項目,編寫 __init__ 文件
  • 使用 setuptools 模塊,編寫 setup.py 和 MANIFEST.in 文件
  • 創建源文件的發布版本
  • 項目注冊&上傳到 PyPI

實驗步驟

本實驗闡述了一個完整的 Python 項目結構,你可以使用什么樣的目錄布局以及怎樣發布軟件到網絡上。

我們的實驗項目名為 factorial

$ mkdir factorial
$ cd factorial/ 

1. 主代碼

我們給將要創建的 Python 模塊取名為 myfact,因此我們下一步創建 myfact 目錄。

$ mkdir myfact
$ cd myfact/ 

主代碼將在 fact.py 文件里面。

"myfact module" def factorial(num): """ 返回給定數字的階乘值 :arg num: 我們將計算其階乘的整數值 :return: 階乘值,若傳遞的參數為負數,則為 -1 """ if num >= 0: if num == 0: return 1 return num * factorial(num -1) else: return -1 

我們還有模塊的 __init__.py 文件,內容如下:

from fact import factorial __all__ = [factorial, ] 

我們還在 factorial 目錄下添加了一個 README.rst 文件。因此,目錄結構看起來像下面這樣:

此處輸入圖片的描述

2. MANIFEST.in

現在我們要寫一個 MANIFEST.in 文件,它用來在使用 sdist 命令的時候找出將成為項目源代碼壓縮包一部分的所有文件。

include *.py include README.rst 

如果你想要排除某些文件,你可以在這個文件中使用 exclude 語句。

3. 安裝 python-setuptools 包

我們使用 virtualenv(這里不示范步驟)。

$ sudo pip3 install setuptools

4. setup.py

最終我們需要寫一個 setup.py,用來創建源代碼壓縮包或安裝軟件。

#!/usr/bin/env python3 """Factorial project""" from setuptools import find_packages, setup setup(name = 'factorial', version = '0.1', description = "Factorial module.", long_description = "A test module for our book.", platforms = ["Linux"], author="ShiYanLou", author_email="support@shiyanlou.com", url="https://www.shiyanlou.com/courses/596", license = "MIT", packages=find_packages() ) 

name 是項目名稱,version 是發布版本,description 和 long_description 分別是項目介紹,項目長描述。platforms 是此模塊的支持平台列表。find_packages() 是一個能在你源目錄下找到所有模塊的特殊函數,packaging docs

4.1. setup.py 用例

要創建一個源文件發布版本,執行以下命令。

$ python3 setup.py sdist

執行完畢會返回類似下面的信息:

running sdist
running egg_info
creating factorial.egg-info
writing factorial.egg-info/PKG-INFO
writing top-level names to factorial.egg-info/top_level.txt
writing dependency_links to factorial.egg-info/dependency_links.txt
writing manifest file 'factorial.egg-info/SOURCES.txt' reading manifest file 'factorial.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' writing manifest file 'factorial.egg-info/SOURCES.txt' running check creating factorial-0.1 creating factorial-0.1/factorial.egg-info creating factorial-0.1/myfact making hard links in factorial-0.1... hard linking MANIFEST.in -> factorial-0.1 hard linking README.rst -> factorial-0.1 hard linking setup.py -> factorial-0.1 hard linking factorial.egg-info/PKG-INFO -> factorial-0.1/factorial.egg-info hard linking factorial.egg-info/SOURCES.txt -> factorial-0.1/factorial.egg-info hard linking factorial.egg-info/dependency_links.txt -> factorial-0.1/factorial.egg-info hard linking factorial.egg-info/top_level.txt -> factorial-0.1/factorial.egg-info hard linking myfact/__init__.py -> factorial-0.1/myfact hard linking myfact/fact.py -> factorial-0.1/myfact Writing factorial-0.1/setup.cfg creating dist Creating tar archive removing 'factorial-0.1' (and everything under it) 

我們能在 dist 目錄下看到一個 tar 壓縮包。

$ ls dist/
factorial-0.1.tar.gz

記住嘗試安裝代碼時使用 virtualenv。

執行下面的命令從源代碼安裝。

$ sudo python3 setup.py install

學習更多可前往 packaging.python.org

5. Python Package Index (PyPI)

你還記得我們經常使用的 pip 命令嗎?有沒有想過這些包是從哪里來的?答案是 PyPI。這是 Python 的軟件包管理系統。

為了實驗,我們會使用 PyPI 的測試服務器 https://testpypi.python.org/pypi

5.1. 創建賬號

首先在這個鏈接注冊賬號。你會收到帶有鏈接的郵件,點擊這個鏈接確認你的注冊。

創建 ~/.pypirc 文件,存放你的賬號詳細信息,其內容格式如下:

[distutils]
index-servers =
    pypi

[pypi]
repository: https://testpypi.python.org/pypi
username: <username> password: <password> 

替換 <username> 和 <password> 為您新創建的帳戶的詳細信息。

記得在 setup.py 中更改項目的名稱為其它的名字來測試下面的指令。

5.2. 注冊項目

下一步我們會注冊我們的項目到 PyPI 服務。這通過 register 命令完成。

我們也會使用 -r 把它指向測試服務器。

$ python3 setup.py register -r https://testpypi.python.org/pypi

執行完畢會返回類似下面的信息:

running register
running egg_info
writing factorial.egg-info/PKG-INFO
writing top-level names to factorial.egg-info/top_level.txt
writing dependency_links to factorial.egg-info/dependency_links.txt
reading manifest file 'factorial.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' writing manifest file 'factorial.egg-info/SOURCES.txt' running check Registering factorial to https://testpypi.python.org/pypi Server response (200): OK 

5.3. 上傳項目

最后我們使用 upload 命令把我們的項目上傳到 PyPI 服務器。記住此命令需要您生成源代碼/二進制分發文件后立即調用。

$ python3 setup.py sdist upload -r https://testpypi.python.org/pypi

返回如下信息:

running sdist
running egg_info
writing factorial.egg-info/PKG-INFO
writing top-level names to factorial.egg-info/top_level.txt
writing dependency_links to factorial.egg-info/dependency_links.txt
reading manifest file 'factorial.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' writing manifest file 'factorial.egg-info/SOURCES.txt' running check creating factorial-0.1 creating factorial-0.1/factorial.egg-info creating factorial-0.1/myfact making hard links in factorial-0.1... hard linking MANIFEST.in -> factorial-0.1 hard linking README.rst -> factorial-0.1 hard linking setup.py -> factorial-0.1 hard linking factorial.egg-info/PKG-INFO -> factorial-0.1/factorial.egg-info hard linking factorial.egg-info/SOURCES.txt -> factorial-0.1/factorial.egg-info hard linking factorial.egg-info/dependency_links.txt -> factorial-0.1/factorial.egg-info hard linking factorial.egg-info/top_level.txt -> factorial-0.1/factorial.egg-info hard linking myfact/__init__.py -> factorial-0.1/myfact hard linking myfact/fact.py -> factorial-0.1/myfact Writing factorial-0.1/setup.cfg Creating tar archive removing 'factorial-0.1' (and everything under it) running upload Submitting dist/factorial-0.1.tar.gz to https://testpypi.python.org/pypi Server response (200): OK 

現在如果你瀏覽這個頁面,你會發現你的項目已經准備好被別人使用了。

此處輸入圖片的描述

總結

本實驗使用了 setuptools 包,並完成了較為完整的項目創建&發布流程,最后還將項目發布到了網絡 (PyPI)上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM