天天看點

使用 pip 釋出 Python 程式

使用 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/

使用 pip 釋出 Python 程式

注冊後還需要進行郵箱驗證,流程和普通網站沒有任何差別,是以具體步驟就不在這裡詳細介紹了。

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
......
           

5. 參考文檔