使用 pip 發佈 Python 程序

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/ [圖片上傳失敗...(image-68efd2-1537870722761)] 註冊後還需要進行郵箱驗證,流程和普通網站沒有任何區別,所以具體步驟就不在這裏詳細介紹了。

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'

5. 參考文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章