要想成為網紅去抖音,上微博;而想讓你的程式紅一把,當然是全球最大的同性交友社群github。作為Python程式設計師,當然還需要把程式釋出到pypi上,讓全世界的pythoner都來下載使用。
這裡有個誤區,不是非要高深的技術才有面子釋出出來共享,而是使用方便和能解決實際問題的程式最受歡迎。
最經典的例子是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目錄下:
釋出到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上了,哈哈。
我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。
***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***