使用 pip 發(fā)布 Python 程序

pypi

寫過 Python 程序的小伙伴們都知道寂玲,需要 import 個(gè)非 Python 自帶的軟件包時(shí)体捏,都要用到 pip 這個(gè)程序冠摄。平時(shí)我們都是用 pip,如果我們寫好了一個(gè)程序几缭,想讓大家都能用的到河泳,那么是不是也可以通過 pip 發(fā)布出去呢?

答案當(dāng)然是可以了年栓,這篇文章我們就來看看如何用 pip 發(fā)布一個(gè) python 程序拆挥。

1. 環(huán)境準(zhǔn)備

要用 pip 發(fā)布 python 程序,首先當(dāng)然是要安裝 Python 和 pip 這兩個(gè)軟件了某抓,以 Ubuntu 16.04 為例:

$ sudo apt update 
$ sudo apt install -y python python-pip

CentOS 和 RedHat 因?yàn)?RPM 體系需要依賴于 python纸兔,更是默認(rèn)就安裝好了。

另外發(fā)布 Pypi否副,還需要安裝一個(gè)發(fā)布工具汉矿,twine,以及其所依賴的 setuptools副编、wheel:

$ sudo pip install --upgrade twine setuptools wheel

好负甸,到這環(huán)境就已經(jīng)就緒了流强。

2. 注冊(cè)帳號(hào)

pip 上傳代碼包是最終保存在 https://pypi.org 這個(gè)網(wǎng)站上的,所以要用 pip 發(fā)布程序呻待,就需要在這個(gè)網(wǎng)站上注冊(cè)一個(gè)帳號(hào)打月。

訪問該網(wǎng)址進(jìn)行注冊(cè):https://pypi.org/account/register/

pypi

注冊(cè)后還需要進(jìn)行郵箱驗(yàn)證,流程和普通網(wǎng)站沒有任何區(qū)別蚕捉,所以具體步驟就不在這里詳細(xì)介紹了奏篙。

3. 代碼結(jié)構(gòu)

要發(fā)布 Python 程序,程序的結(jié)構(gòu)必須符合特定的要求迫淹,假設(shè)要發(fā)布的程序名為 example-pkg秘通,基本的目錄結(jié)構(gòu)如下:

/example-pkg
  /example-pkg
    __init__.py
  setup.py
  LICENSE
  README.md

說一下目錄和文件的含義:

  • 首先最外層要建立一個(gè)和發(fā)出程序同名的文件夾:/example-pkg
  • 該文件夾下還要再簡歷一個(gè)同名文件夾,用來存放程序代碼:/example-pkg/example-pkg
  • Python 的老規(guī)矩敛熬,example-pkg/example-pkg 目錄下當(dāng)然要有一個(gè) __init__.py 文件肺稀。
  • /example-pkg 目錄下要有一個(gè)叫 setup.py 的文件,如果下載過 Python 代碼包应民,應(yīng)該都知道這個(gè)文件话原,需要通過這個(gè)文件進(jìn)行 Python 代碼的編譯(可能會(huì)有依賴的其他代碼包或者依賴的 C 文件)和安裝。
  • LICENSE 文件:這個(gè)文件就是用來保存代碼所使用的開源許可證诲锹。
  • README.md:這個(gè)是軟件行業(yè)的慣例了繁仁,幫助文檔。

對(duì)于 setup.py 文件归园,還有必要好好說說黄虱,先貼個(gè)例子,下面這個(gè)例子中庸诱,主要是實(shí)現(xiàn)了從 /example-pkg/example-pkg/__init__.py 文件中讀取 version 參數(shù)捻浦,來配置當(dāng)前軟件的版本,并指定了代碼包名(name)桥爽、作者(author)默勾、郵箱(author_email)、描述信息(long_description聚谁、long_description_content_type)、依賴(install_requires)滞诺,以及哪些文件不會(huì)被打包到程序中(exclude_package_data)形导。

另外需要提醒大家一點(diǎn),給程序起名字不要帶下劃線(_)习霹,python import 代碼包時(shí)朵耕,是不支持下劃線包名的,出現(xiàn)這種情況就比較尷尬淋叶,代碼裝上了阎曹,還是用不了。

#!/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="author@example.com",
    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. 上傳和檢查

一切準(zhǔn)備就緒,下面就可以執(zhí)行打包命令处嫌,產(chǎn)生要上傳的代碼包了:

$ python setup.py sdist bdist_wheel

執(zhí)行結(jié)束后栅贴,會(huì)產(chǎn)生如下目錄和文件:

/example-pkg/dist/
  example-pkg-0.0.1-py3-none-any.whl
  example-pkg-0.0.1.tar.gz

包有了,就差上傳了熏迹,執(zhí)行第一步中安裝的 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]

上傳完畢檐薯!不過這里有一點(diǎn)需要注意,上傳新版本后注暗,很可能 pip search 還沒法查到版本的更新坛缕,這是正常的,我理解是
pip search 命令依賴于緩存捆昏,所以不會(huì)立刻生效赚楚。

接下來就讓我們下載自己剛剛上傳的 python 試試吧:

$ pip install example-pkg
$ python
>>> import example-pkg
>>> example-pkg.name
'example-pkg'

最后再補(bǔ)充一點(diǎn),上傳可能會(huì)失敗骗卜,提示無法上傳指定的代碼包宠页,此時(shí)很大的可能是 pypi 中已經(jīng)有了相同的代碼包,所以建議在上傳之前膨俐,先搜索一下是否有重名的代碼包勇皇,選擇一個(gè)不沖突的名字,再上傳焚刺。

例如下面這個(gè)例子敛摘,example-pkg 已經(jīng)存在了,如果要再上傳乳愉,那當(dāng)然會(huì)失敗兄淫,換個(gè)名字就解決了。

$ pip search example-pkg
example-pkg (0.0.7)                                            - A small example package
......

5. 參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔓姚,一起剝皮案震驚了整個(gè)濱河市捕虽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坡脐,老刑警劉巖泄私,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異备闲,居然都是意外死亡晌端,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門恬砂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咧纠,“玉大人,你說我怎么就攤上這事泻骤∑岣幔” “怎么了梧奢?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長演痒。 經(jīng)常有香客問我亲轨,道長,這世上最難降的妖魔是什么嫡霞? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任瓶埋,我火速辦了婚禮,結(jié)果婚禮上诊沪,老公的妹妹穿的比我還像新娘养筒。我一直安慰自己,他們只是感情好端姚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布晕粪。 她就那樣靜靜地躺著,像睡著了一般渐裸。 火紅的嫁衣襯著肌膚如雪巫湘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天昏鹃,我揣著相機(jī)與錄音尚氛,去河邊找鬼。 笑死洞渤,一個(gè)胖子當(dāng)著我的面吹牛阅嘶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播载迄,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讯柔,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了护昧?” 一聲冷哼從身側(cè)響起魂迄,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惋耙,沒想到半個(gè)月后捣炬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绽榛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年遥金,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒜田。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖选泻,靈堂內(nèi)的尸體忽然破棺而出冲粤,到底是詐尸還是另有隱情美莫,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布梯捕,位于F島的核電站厢呵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏傀顾。R本人自食惡果不足惜襟铭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望短曾。 院中可真熱鬧寒砖,春花似錦、人聲如沸嫉拐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婉徘。三九已至漠嵌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盖呼,已是汗流浹背儒鹿。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留几晤,地道東北人约炎。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像锌仅,于是被迫代替她去往敵國和親章钾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Distutils可以用來在Python環(huán)境中構(gòu)建和安裝額外的模塊热芹。新的模塊可以是純Python的贱傀,也可以...
    MiracleJQ閱讀 3,074評(píng)論 0 1
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評(píng)論 0 10
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    小邁克閱讀 2,989評(píng)論 1 3
  • 最近休了一個(gè)不算短的假期伊脓,因臨時(shí)安排府寒,反倒省了做攻略的環(huán)節(jié)。 外公外婆正好在北京帶芳芳报腔,大家一致決定去東北株搔。畢竟與...
    豆迪閱讀 316評(píng)論 0 0
  • 不知道為什么,昨天考完試之后并不是那么難過纯蛾,或許正如別人所說纤房,開心進(jìn)考場(chǎng),開心出考場(chǎng)翻诉,無所謂結(jié)果炮姨。 考試前一天女神...
    渣渣xm閱讀 428評(píng)論 0 3