
pypi
寫過 Python 程式的小夥伴們都知道,需要 import 個非 Python 自帶的軟體包時,都要用到 pip 這個程式。平時我們都是用 pip,如果我們寫好了一個程式,想讓大家都能用的到,那麼是不是也可以通過 pip 釋出出去呢?
答案當然是可以了,這篇文章我們就來看看如何用 pip 釋出一個 python 程式。
1. 環境準備
要用 pip 釋出 python 程式,首先當然是要安裝 Python 和 pip 這兩個軟體了,以 Ubuntu 16.04 為例:
$ sudo apt update
$ sudo apt install -y python python-pip
CentOS 和 RedHat 因為 RPM 體系需要依賴于 python,更是預設就安裝好了。
另外釋出 Pypi,還需要安裝一個釋出工具,twine,以及其所依賴的 setuptools、wheel:
$ sudo pip install --upgrade twine setuptools wheel
好,到這環境就已經就緒了。
2. 注冊帳号
pip 上傳代碼包是最終儲存在
https://pypi.org這個網站上的,是以要用 pip 釋出程式,就需要在這個網站上注冊一個帳号。
通路該網址進行注冊:
https://pypi.org/account/register/
注冊後還需要進行郵箱驗證,流程和普通網站沒有任何差別,是以具體步驟就不在這裡詳細介紹了。
3. 代碼結構
要釋出 Python 程式,程式的結構必須符合特定的要求,假設要釋出的程式名為 example-pkg,基本的目錄結構如下:
/example-pkg
/example-pkg
__init__.py
setup.py
LICENSE
README.md
說一下目錄和檔案的含義:
- 首先最外層要建立一個和發出程式同名的檔案夾:/example-pkg
- 該檔案夾下還要再履歷一個同名檔案夾,用來存放程式代碼:/example-pkg/example-pkg
- Python 的老規矩,example-pkg/example-pkg 目錄下當然要有一個
檔案。__init__.py
- /example-pkg 目錄下要有一個叫 setup.py 的檔案,如果下載下傳過 Python 代碼包,應該都知道這個檔案,需要通過這個檔案進行 Python 代碼的編譯(可能會有依賴的其他代碼包或者依賴的 C 檔案)和安裝。
- LICENSE 檔案:這個檔案就是用來儲存代碼所使用的開源許可證。
- README.md:這個是軟體行業的慣例了,幫助文檔。
對于 setup.py 檔案,還有必要好好說說,先貼個例子,下面這個例子中,主要是實作了從
/example-pkg/example-pkg/__init__.py
檔案中讀取 version 參數,來配置目前軟體的版本,并指定了代碼包名(name)、作者(author)、郵箱(author_email)、描述資訊(long_description、long_description_content_type)、依賴(install_requires),以及哪些檔案不會被打包到程式中(exclude_package_data)。
另外需要提醒大家一點,給程式起名字不要帶下劃線(_),python import 代碼包時,是不支援下劃線包名的,出現這種情況就比較尴尬,代碼裝上了,還是用不了。
#!/usr/bin/env python
import re
import setuptools
version = ""
with open('example-pkg/__init__.py', 'r') as fd:
version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]',
fd.read(), re.MULTILINE).group(1)
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="example-pkg",
version=version,
author="example",
author_email="[email protected]",
description="This is the SDK for example.",
long_description=long_description,
long_description_content_type="text/markdown",
url="http://example.com",
install_requires=[
'requests!=2.9.0',
'lxml>=4.2.3',
'monotonic>=1.5',
],
packages=setuptools.find_packages(exclude=("test")),
classifiers=(
"License :: OSI Approved :: MIT License",
"Intended Audience :: Developers",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5"
),
exclude_package_data={'': ["example-pkg/test.py", "example-pkg/config.txt"]},
)
4. 上傳和檢查
一切準備就緒,下面就可以執行打包指令,産生要上傳的代碼包了:
$ python setup.py sdist bdist_wheel
執行結束後,會産生如下目錄和檔案:
/example-pkg/dist/
example-pkg-0.0.1-py3-none-any.whl
example-pkg-0.0.1.tar.gz
包有了,就差上傳了,執行第一步中安裝的 twine 指令:
$ twine upload dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Enter your username: <your pypi.org username>
Enter your password: <your pypi.org password>
Uploading example-pkg-0.0.1-py3-none-any.whl
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 45.0k/45.0k [00:01<00:00, 24.0kB/s]
Uploading example-pkg-0.0.1.tar.gz
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 43.8k/43.8k [00:00<00:00, 46.2kB/s]
上傳完畢!不過這裡有一點需要注意,上傳新版本後,很可能
pip search
還沒法查到版本的更新,這是正常的,我了解是
pip search
指令依賴于緩存,是以不會立刻生效。
接下來就讓我們下載下傳自己剛剛上傳的 python 試試吧:
$ pip install example-pkg
$ python
>>> import example-pkg
>>> example-pkg.name
'example-pkg'
最後再補充一點,上傳可能會失敗,提示無法上傳指定的代碼包,此時很大的可能是 pypi 中已經有了相同的代碼包,是以建議在上傳之前,先搜尋一下是否有重名的代碼包,選擇一個不沖突的名字,再上傳。
例如下面這個例子,example-pkg 已經存在了,如果要再上傳,那當然會失敗,換個名字就解決了。
$ pip search example-pkg
example-pkg (0.0.7) - A small example package
......