Python程序包的構(gòu)建和發(fā)布過程

關(guān)于我
一個有思想的程序猿,終身學(xué)習(xí)實踐者,目前在一個創(chuàng)業(yè)團(tuán)隊任team lead,技術(shù)棧涉及Android、Python、Java和Go,這個也是我們團(tuán)隊的主要技術(shù)棧。
Github:https://github.com/hylinux1024
微信公眾號:終身開發(fā)者(angrycode)

當(dāng)我們開發(fā)了一個開源項目時,就希望把這個項目打包然后發(fā)布到pypi.org上,別人就可以通過pip install的命令進(jìn)行安裝。本文的教程來自于Python官方文檔,如有不正確的地方歡迎評論拍磚。

0x00 創(chuàng)建項目

本文使用到的項目目錄為

?  packaging-tutorial
.
└── bestpkg
    └── __init__.py

接下來的所有操作都是在packing_tutorial這個目錄下進(jìn)行的。首先把bestpkg這個目錄下的__init__.py添加以下內(nèi)容

info='packaging demo'

這個信息主要用于打包成功后安裝測試用的。

0x01 項目結(jié)構(gòu)

一個待發(fā)布的項目還需要有以下這些文件:setup.py、LICENSEREADME.md

?  packaging-tutorial
.
├── LICENSE
├── README.md
├── bestpkg
│   └── __init__.py
└── setup.py

0x02 setup.py

setup.py文件是給setuptools工具的使用腳本,告訴setuptools如何構(gòu)建我們的項目。打開編輯器,編輯setup.py文件,輸入以下內(nèi)容

import setuptools

# 讀取項目的readme介紹
with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="bestpkg",# 項目名稱,保證它的唯一性,不要跟已存在的包名沖突即可
    version="0.0.1",
    author="hylinux1024", # 項目作者
    author_email="hylinux1024@gmail.com",
    description="一個牛逼的程序", # 項目的一句話描述
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/hylinux1024/niubiproject",# 項目地址
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
)
  • name
    項目名稱,保證它的唯一性,不要跟已存在的包名沖突即可,否則會發(fā)布失敗
  • version
    版本號
  • author
    作者
  • author_email
    作者郵箱
  • description
    一句話描述項目
  • long_description
    項目詳細(xì)說明,一般直接讀取README.md的內(nèi)容
  • url
    項目的鏈接地址
  • packages
    列出當(dāng)前項目的包,一般直接使用find_packages()即可
  • classifiers
    這里指定Python的兼容版本是Python3,也指定了項目使用的開源協(xié)議。

0x03 README.md

給項目添加詳細(xì)的README

# Example Package

This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.

0x04 LICENSE

要發(fā)布包到pypi上,選擇一個合適的開源協(xié)議是非常重要的。如果不知道怎么選可以到https://choosealicense.com/這里看看。

0x05 項目打包

項目需要打包后才能發(fā)布,要打包項目需先安裝最新版本的setuptoolswheel

? python3 -m pip install --user --upgrade setuptools wheel

然后使用以下命令進(jìn)行打包

? python3 setup.py sdist bdist_wheel

當(dāng)看到以下信息,說明已經(jīng)打包成功

...
...
...
adding license file "LICENSE" (matched pattern "LICEN[CS]E*")
creating build/bdist.macosx-10.14-x86_64/wheel/bestpkg-0.0.1.dist-info/WHEEL
creating 'dist/bestpkg-0.0.1-py3-none-any.whl' and adding 'build/bdist.macosx-10.14-x86_64/wheel' to it
adding 'bestpkg/__init__.py'
adding 'bestpkg-0.0.1.dist-info/LICENSE'
adding 'bestpkg-0.0.1.dist-info/METADATA'
adding 'bestpkg-0.0.1.dist-info/WHEEL'
adding 'bestpkg-0.0.1.dist-info/top_level.txt'
adding 'bestpkg-0.0.1.dist-info/RECORD'
removing build/bdist.macosx-10.14-x86_64/wheel

在項目目錄下會生成一個distbuild文件夾

?  packaging-tutorial tree
.
├── LICENSE
├── README.md
├── bestpkg
│   └── __init__.py
├── bestpkg.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
├── build
│   ├── bdist.macosx-10.14-x86_64
│   ├── bdist.macosx-10.9-x86_64
│   └── lib
│       └── bestpkg
│           └── __init__.py
├── dist
│   ├── bestpkg-0.0.1-py3-none-any.whl
│   └── bestpkg-0.0.1.tar.gz
└── setup.py

8 directories, 11 files

dist文件中有兩個文件

dist
    ├── bestpkg-0.0.1-py3-none-any.whl
    └── bestpkg-0.0.1.tar.gz

tar.gz文件是源碼文件壓縮包,而.whl就是打包后的文件。最新的pip命令會安裝這個.whl文件。

0x06 上傳

現(xiàn)在就可以上傳到Python索引庫了。我們使用Test PyPI,這個是測試用的Pypi,本例子也是使用Test Pypi。

首先要到https://test.pypi.org/account/register/注冊賬號。本例中我注冊的賬號為:hylinux1024。

然后使用twine工具來上傳我們的包。使用以下命令進(jìn)行安裝:

? python3 -m pip install --user --upgrade twine

使用以下命令上傳dist目錄下的文件

? python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*

這個命令會提示輸入剛在test.pypi.org上注冊賬號密碼,并出現(xiàn)類似以下信息后說明已經(jīng)上傳成功。

Enter your username: hylinux1024
Enter your password:
Uploading distributions to https://test.pypi.org/legacy/
Uploading bestpkg-0.0.1-py3-none-any.whl
100%|██████████████████████████████████████| 4.57k/4.57k [00:00<00:00, 8.01kB/s]
Uploading bestpkg-0.0.1.tar.gz
100%|██████████████████████████████████████| 4.18k/4.18k [00:01<00:00, 3.23kB/s]

然后打開https://test.pypi.org/project/bestpkg/這個地址就可以看到我們發(fā)布的包。

0x07 安裝

發(fā)布成功之后就可以使用pip來安裝來。我們在虛擬環(huán)境中安裝,關(guān)于虛擬環(huán)境可以看我前一篇文章。

這里就使用pipenv,這里我直接進(jìn)入到我昨天創(chuàng)建的那個項目中,也為了更好演示安裝結(jié)果。

? pip install --index-url https://test.pypi.org/simple/ --no-deps bestpkg

在這里我使用--index-url參數(shù)是為了指定從test.pypi.org中安裝,而不是正式包索引庫中查找要安裝的包。還有使用了--no-deps參數(shù)是因為本例中沒有使用到其它的依賴庫。

在終端會看到以下類似信息,說明安裝成功

Looking in indexes: https://test.pypi.org/simple/
Collecting bestpkg
  Downloading https://test-files.pythonhosted.org/packages/5a/fc/c109b3872b6c06e7368c30b6e52501113846f90ca716a434766151093173/bestpkg-0.0.1-py3-none-any.whl
Installing collected packages: bestpkg
Successfully installed bestpkg-0.0.1

進(jìn)入交互界面

(pipenvdemo) ?  pipenvdemo python
>>> import bestpkg
>>> bestpkg.info
'packaging demo'

info變量就是在__init__.py文件中定義的變量。自此我們的包發(fā)布、安裝使用流程就走完了。

要在正式的Python索引庫中發(fā)布,只需要到https://pypi.org/注冊賬號,并上傳就可以了。

0x08 總結(jié)一下

通過一個簡單的例子展示Python通過setuptools工具進(jìn)行打包,然后上傳到test.pypi.org的流程。如果要上傳到正式的pypi.org上,只需要注冊一個正式的賬號。一旦發(fā)布成功就可以使用pip install [your-package]的命令進(jìn)行安裝。

0x09 引用

?著作權(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)容