setuptools把python程式釋出到pypi的攻略

王平發表於2019-04-28

要想成為網紅去抖音,上微博;而想讓你的程式紅一把,當然是全球最大的同性交友社群github。作為Python程式設計師,當然還需要把程式釋出到pypi上,讓全世界的pythoner都來下載使用。

pypi web介面

這裡有個誤區,不是非要高深的技術才有面子釋出出來共享,而是使用方便和能解決實際問題的程式最受歡迎。

 

最經典的例子是requests庫作者Kenneth Reitz ,在這之前已經有url請求庫了,但是使用較繁複,KR想把請求介面做得更人性化一點(for humans)(讓程式設計師更容易使用),所以就有了requests庫,這是他22歲時寫出來的(關於K神的經歷看猿人學這篇《Python requests作者是一個什麼樣的人》),pypi上官方統計requests庫幾年前的全球下載量已達3億次,K神可謂一戰成名。

當然requests庫其實有技術含量的,設計一套人性化,好用的介面本身就是技術含量。

pypi上也有很多很火的,是那種解決了很實際問題的程式。比如Faker這個庫,它可以按要求隨機生成一個人名,一個手機號,一個車牌號,瀏覽器UA等等。這個功能很實用,因為我們在寫程式的時候經常會用到一些資料,Faker可以幫助我們生成這些假資料,而且要隨機,不需要我們再去自己寫規則來隨機生成了。比如你在寫爬蟲時要頻繁修改UA,以免被對方網站訪問限制了,Faker能隨機生成指定瀏覽器廠商的真實UA版本號。

 

Faker庫的技術一點都不復雜,需要你收集這些資料資訊,整理出規律後讓程式按規則去隨機生成就行了。但是Faker庫卻非常受歡迎,當知道pypi上有這麼一個庫後,經常需要組裝這類資料的我,只能感嘆一句,what a fxxk,我怎麼沒想到做一個呢。

所以如果你有一個程式,能幫助其它人解決一點實在的問題,就大膽向pypi提交吧,把你的大名掛在pypi上,看著有人下載使用你的程式,也是美滋滋的。

 

怎樣向pypi提交發布你的包呢?

學習和使用Python的同學都應該知道,Python的包管理工具pip,平常使用的各種非官方內建的包基本上都可以通過pip install xxx來安裝。那麼pip背後的運作機制是怎樣的呢?pip install的東西從哪裡來的?

從PyPI (Python Package Index)來的,老官網的地址是:

https://pypi.python.org/pypi/

現在已經啟用新的域名:

https://pypi.org/

執行pip install xxx命令的時候,它就會去從官方網站搜xxx,搜到了就下載壓縮包並解壓安裝,如果沒有搜尋到就會報錯。

眾所周知的原因,國內訪問國外網站總是不那麼順暢,於是就有了PyPI映象,國內有很多,我用過阿里雲的,中科大的,豆瓣的。阿里雲的同步的好像不夠及時,中科大的好像很及時,所以我就用中科大的。那麼,該怎麼用這些映象呢?

方法1: 給pip加引數-i 後面跟映象的url,但是要記住並每次都寫這個url可是一件難事。

方法2: 編寫配置檔案~/.pip/pip.conf:


[global]
index-url = https://mirrors.ustc.edu.cn/pypi/web/simple

 

如何把你自己的Python程式釋出到PyPI上面去?

首先去官網註冊你的賬號,不能師出無名總得留下你的大名嘛。註冊地址:

https://pypi.org/account/register/

註冊好後編寫你的配置檔案~/.pypirc


[distutils]
index-servers =
    pypi
    pypitest
[pypi]
repository=https://upload.pypi.org/legacy
username=Your-Account
password=Your-Password

[pypitest]
repository=https://test.pypi.org/legacy
username=Your-Account
password=Your-Password

這裡配置了兩個地址,一個是PyPI Live,是正式釋出Python包的;另一個是PytPI Test 是用來正式釋出之前驗證你的包是否正常。

 

準備好你的Python包

通常你的程式碼目錄結構如下:


root-dir/   # 你的程式碼的根目錄
  setup.py
  setup.cfg
  LICENSE.txt
  README.md
  mypackage/
    __init__.py
    foo.py
    bar.py
    baz.py

其中的setup.py就是安裝包的檔案,格式如下:


from distutils.core import setup
setup(
  name = 'mypackage',
  packages = ['mypackage'], # 跟上面程式碼目錄下面的包名一致
  version = '0.1',
  description = 'A setup test package',
  author = 'veelion',
  author_email = 'veelion@gmail.com',
  url = 'https://github.com/veelion/mypackage', # 指向 github 倉庫的URL
  keywords = ['testing', 'logging', 'example'], # 一些關鍵詞
  classifiers = [],
)

setup可以從兩個包裡面調來使用,一個是上面用的distutils,另外一個是setuptools,如:

from setuptools import setup

這兩個包功能基本一樣,而setuptools支援wheel(未來包管理的趨勢),所以一般用setuptools更好一些。再多說兩句wheel,它是用來準備替換老的egg的,其中很好的一個優點是“二進位制格式釋出”,當包內含有C/C++寫的擴充套件的時候可以把.so/.dll等二進位制庫打包進去,實現“一次編譯,到處使用”的目標。省的使用者編譯時需要解決一堆依賴問題。

但是setuptools好像是不支援單檔案包,即你的包只是一個.py檔案而非上面說的是一個帶__init__.py我目錄。必須通過py_modules來指定單個檔案作為包。

上面說的是用setup.py管理Python包讓其他人import用,而非在命令列下執行。

如果你的包支援命令列執行,可以在setup.py裡面通過entry_points 來指定執行入口,也可以通過scripts來把相關可以執行檔案安裝到bin目錄下:

pip setup配置

 

釋出到PyPI

首先,打包生成壓縮包


python setup.py sdist
python setup.py bdist_wheel (distutils不支援這個wheel選項)

然後,上傳到PyPI:


python setup.py register #註冊你的包,如果出現與已有包重名則報錯
python setup.py upload

或者可以用twine:


twine register dist/xxx.gz
twine register dist/xxx.whl
twine upload dist/*

就這樣,一個明日之星的程式就釋出到pypi上了,哈哈。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章