【譯】Python 發(fā)布包

《翻譯-Python 發(fā)布包》斗躏,原文地址:https://packaging.python.org/tutorials/packaging-projects/

這篇指南向您介紹如何打包一個簡單的 python 工程蹄胰,內(nèi)容包含包的目錄結(jié)構(gòu)以及需要添加哪些必要的文件具帮。怎樣編譯包柿究?以及怎樣將包上傳到 pypi 公共倉庫斑司。

一個簡單的項目

現(xiàn)有一個叫做 example_pkg的包需要發(fā)布绽媒。如果您已經(jīng)擁有一個需要打包的工程妙蔗,我們建議向如下的目錄結(jié)構(gòu)去規(guī)整您的工程傲霸。

packaging_tutorial
└── example_pkg
    └── __init__.py

一旦按照如上的目錄結(jié)構(gòu)創(chuàng)建項目,接下來所有在命令行運行的指令只需切換到根目錄下即可眉反,即——$ cd packaging_tutorial

創(chuàng)建包文件

現(xiàn)在你需要創(chuàng)建一些文件昙啄,為發(fā)布包做準(zhǔn)備。你需要將它們放在根目錄下寸五,暫時可以創(chuàng)建空文件梳凛,內(nèi)容待會填充。

packaging_tutorial
├── LICENSE
├── README.md
├── example_pkg
│   └── __init__.py
├── setup.py
└── tests

創(chuàng)建測試文件夾

tests/ 目錄用于單元測試梳杏,暫時先讓它空著吧韧拒。

創(chuàng)建 setup.py 文件

setup.py是 setuptools 工具的構(gòu)件腳本,它會告訴 setuptools 包的一些基礎(chǔ)信息以及包含哪些文件十性。

打開 setup.py 文件然后寫入如下內(nèi)容叛溢。您需要替換一些信息,主要是包名烁试,確保不會和 Pypi 公共倉庫現(xiàn)有的包名沖突雇初。

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="example-pkg-YOUR-USERNAME-HERE", # 替換成您的包名,由字母减响、數(shù)字靖诗、-郭怪、_組成
    version="0.0.1",
    author="Example Author",
    author_email="author@example.com",
    description="A small example package",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/pypa/sampleproject",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

創(chuàng)建 README.md 文件

打開 README.md 文件,寫入如下內(nèi)容:

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

創(chuàng)建 LICENSE 文件

每一個上傳到 Pypi 的包都需要證書刊橘,這將告訴那些安裝您包的用戶鄙才,應(yīng)當(dāng)在什么樣的情況下可以正常使用您的包。

您可以在 https://choosealicense.com/ 網(wǎng)站上選擇合適的證書促绵,一旦你確定了哪種證書攒庵,打開 LICENSE 文件然后寫入內(nèi)容。

這里假設(shè)您選擇的 MIT 證書败晴,寫入如下內(nèi)容:

Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

打包

接下來就是生成打包產(chǎn)物了浓冒,打包產(chǎn)物將會被上傳到 Pypi 公共倉庫,并可以通過 pip 安裝到本地尖坤。

確保您已經(jīng)安裝了最新版本的 setuptoolswheel稳懒,如果沒有,執(zhí)行以下命令:

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

運行命令進(jìn)行打包:

$ python3 setup.py sdist bdist_wheel

這條命令會在終端輸入一些內(nèi)容以及在根目錄下生成 dist 目錄:

dist/
  example_pkg_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
  example_pkg_YOUR_USERNAME_HERE-0.0.1.tar.gz

上傳打包產(chǎn)物

最后慢味,您需要將打包產(chǎn)物上傳到 Pypi 公共倉庫场梆。

您需要做的第一件事就是在 Test PyPI網(wǎng)站注冊一個賬號,Test PyPI 和 PyPI 是兩個獨立的網(wǎng)站纯路,它主要用于測試和實驗或油,并不會將包上傳到正式的 Pypi 倉庫。

前往 https://test.pypi.org/account/register/ 網(wǎng)頁驰唬,注冊一個賬號顶岸,您需要填寫一些基礎(chǔ)信息,并驗證郵箱定嗓。

當(dāng)您注冊完成后蜕琴,前往 https://test.pypi.org/manage/account/#api-tokens 網(wǎng)頁創(chuàng)建 API TOKEN ,這用于上傳包時的身份校驗宵溅。在上傳包整個流程完成之前不要關(guān)閉創(chuàng)建 token 頁面凌简。

確保您已經(jīng)安裝了最新版本的 twine ,如果沒有的話恃逻,執(zhí)行以下命令:

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

使用 twine命令上傳你的包:

$ python3 -m twine upload --repository testpypi dist/*

終端會讓您輸入 usernmae 和 password雏搂。username 請輸入 __token__ 字符串,password 請粘貼剛才的 token 值

(您粘貼過密碼后可能會發(fā)現(xiàn) password 后面是空的寇损,不用擔(dān)心凸郑,這出于安全考慮,密碼一般不顯示矛市,但已經(jīng)粘貼上了芙沥,回車即可)。

Uploading distributions to https://test.pypi.org/legacy/
Enter your username: [your username]
Enter your password:
Uploading example_pkg_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
100%|█████████████████████| 4.65k/4.65k [00:01<00:00, 2.88kB/s]
Uploading example_pkg_YOUR_USERNAME_HERE-0.0.1.tar.gz
100%|█████████████████████| 4.25k/4.25k [00:01<00:00, 3.05kB/s]

上面的步驟執(zhí)行完成后,您可以訪問 https://test.pypi.org/project/example-pkg-YOUR-USERNAME-HERE 查看上傳到測試倉庫的包而昨。

安裝上傳的包

現(xiàn)在救氯,使用 pip 安裝剛剛上傳的包,在本地測試下它是否功能正常吧歌憨。

創(chuàng)建虛擬環(huán)境:

$ mkdir test-pkg                                # 創(chuàng)建測試目錄
$ cd test-pkg
$ $ python -m venv .venv        # 創(chuàng)建虛擬環(huán)境     
$ source .venv/bin/acticate         # 激活虛擬環(huán)境 

將下面這條命令中 example-pkg-YOUR-USERNAME-HERE 替換為你的包名着憨。

python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-pkg-YOUR-USERNAME-HERE

pip 會自動安裝包,終端會輸出如下信息:

Collecting example-pkg-YOUR-USERNAME-HERE
  Downloading https://test-files.pythonhosted.org/packages/.../example-pkg-YOUR-USERNAME-HERE-0.0.1-py3-none-any.whl
Installing collected packages: example-pkg-YOUR-USERNAME-HERE
Successfully installed example-pkg-YOUR-USERNAME-HERE-0.0.1

您可以在 python 解釋器或其它方式測試包的功能是否正常务嫡。

$ python
>>> import example_pkg

上傳到 PyPI 正式環(huán)境

恭喜甲抖!您已經(jīng)完成了打包以及發(fā)布到倉庫整個流程。

不要忘記心铃,這份指南只是教你將包發(fā)布到了 Test PyPI 測試倉庫准谚,而不是 PyPI 公共倉庫。當(dāng)您測試完成于个,確保包的功能性無誤后可以將包上傳到正式倉庫氛魁,可以參考本指南暮顺,僅有幾點需要注意:

  • 選擇一個易記且獨一無二的包名厅篓。
  • https://pypi.org 網(wǎng)站注冊用戶。
  • 使用 twine upload dist/* 上傳包到公共倉庫時捶码,輸入 pypi.org 網(wǎng)站的用戶名和密碼羽氮,并且不需要指定 --repository 參數(shù),包將會被上傳到 PyPI 正式倉庫惫恼。
  • 安裝包將變得更加簡單档押,只需要 $ pip install [your-package]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祈纯,一起剝皮案震驚了整個濱河市令宿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稍走,老刑警劉巖这吻,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曲管,死亡現(xiàn)場離奇詭異,居然都是意外死亡癞松,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門入蛆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來响蓉,“玉大人,你說我怎么就攤上這事哨毁》慵祝” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長想幻。 經(jīng)常有香客問我软能,道長,這世上最難降的妖魔是什么举畸? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任查排,我火速辦了婚禮,結(jié)果婚禮上抄沮,老公的妹妹穿的比我還像新娘跋核。我一直安慰自己,他們只是感情好叛买,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布砂代。 她就那樣靜靜地躺著,像睡著了一般率挣。 火紅的嫁衣襯著肌膚如雪刻伊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天椒功,我揣著相機與錄音捶箱,去河邊找鬼。 笑死动漾,一個胖子當(dāng)著我的面吹牛丁屎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旱眯,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼晨川,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了删豺?” 一聲冷哼從身側(cè)響起共虑,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呀页,沒想到半個月后妈拌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡赔桌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年供炎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疾党。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡音诫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雪位,到底是詐尸還是另有隱情竭钝,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站香罐,受9級特大地震影響卧波,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庇茫,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一港粱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旦签,春花似錦查坪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羔巢,卻和暖如春望忆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竿秆。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工启摄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袍辞。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓鞋仍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搅吁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345