使用Python編程的都知道,Python的包安裝非常的方便,一般都是可以pip來安裝搞定:
sudo pip install <package name>
pip的安裝請移步:https://pip.pypa.io/en/stable/installing/
最近因為項目上的需要,發布了一個自己的pypi Python包,這里我大致分享如何發布自己的Pypi包一般過程。
打包工作主要依賴python的一個叫setuptools的包來完成,在進行下面操作前請使用pip安裝它:
sudo pip install setuptools
(這里面我都是假設你已經准備好你的代碼,測試代碼以及目錄結構,加上我今天要分享的,就可以組成一個完整的python包)
-
1. 第一步,就是到pypi(https://pypi.python.org/pypi)上注冊自己的用戶, 點擊“Register”,填寫自己的用戶名,密碼,郵件地址后,就成功了。
記住自己的用戶名和密碼,后面上傳的時候要輸入的
-
2. 准備setup.py/setup.conf文件,它是放在你包的根目錄的,這一步至關重要,包括要發布的包名字,版本,license,描述,特性(classifier)等等,下面是我自己包的一個setup.py文件的內容,基本上只需要在這個上面修改就行了,具體如下:
#!/usr/bin/env python # coding=utf-8 from setuptools import setup, find_packages setup( name='<項目的名稱>', version=<項目版本>, description=( '<項目的簡單描述>' ), long_description=open('README.rst').read(), author='<你的名字>', author_email='<你的郵件地址>', maintainer='<維護人員的名字>', maintainer_email='<維護人員的郵件地址', license='BSD License', packages=find_packages(), platforms=["all"], url='<項目的網址,我一般都是github的url>', classifiers=[ 'Development Status :: 4 - Beta', 'Operating System :: OS Independent', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Programming Language :: Python', 'Programming Language :: Python :: Implementation', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Topic :: Software Development :: Libraries' ], )
需要注意的上面的字段:
- version - 這個簡單,就是包的發布的版本,可以直接寫在這,也可以從其他地方引用過來。
- long_description - 必須是rst(reStructuredText )格式的,因為這個里面的內容是顯示在pypi包首頁上,具體rst的語法可以參考:http://rest-sphinx-memo.readthedocs.io/en/latest/ReST.html
我的long_description是同目錄下的README.rst的內容,同時這個README也是我的github項目首頁。
- packages - 申明你的包里面要包含的目錄,比如 ['mypackage', 'mypackage_test'] 可以是這種使用我的示例,讓setuptools自動決定要包含哪些包
- install_requires - 申明依賴包,安裝包時pip會自動安裝:格式如下(我上面的setup.py沒有這個參數,因為我不依賴第三方包:)):
install_requires=[ 'Twisted>=13.1.0', 'w3lib>=1.17.0', 'queuelib', 'lxml', 'pyOpenSSL', 'cssselect>=0.9', 'six>=1.5.2', 'parsel>=1.1', 'PyDispatcher>=2.0.5', 'service_identity', ]
3. 准備requirements.txt 和 test-requirements.txt,這個申明包的依賴包和跑自動化測試的測試依賴包,具體格式示例如下:
mock>=2.0.0 flake8>=3.2.1 eventlet>=0.19.0 nose2>=0.6.5 cov_core>=1.15.0 virtualenv>=15.1.0
以上是我的test-requirements.txt的內容,requirements.txt的格式個上面一樣。
准備這個兩個文件不是必須的。
但是,有了它們,用戶可以自己手動安裝依賴包
pip install -r requirements.txt
有了它們,結合tox等工具,可以非常方便的加入自動化測試。
-
4. 准備一個項目的README.rst文件,前面也提到了它的格式要求,第一次發包,可以直接copy別人的格式,這東西熟能生巧,多寫就會了。
README的截圖就不放了,以免廣告嫌疑。有興趣可以到參考http://rest-sphinx-memo.readthedocs.io/en/latest/ReST.html
-
5. 准備好上面的步驟,一個包就基本完整了,剩下的就是打包了(cd到包的根目錄):
可以使用下面命令打包一個源代碼的包:
python setup.py sdist build
這樣在當前目錄的dist文件夾下,就會多出一個以tar.gz結尾的包了:
也可以打包一個wheels格式的包,使用下面的命令搞定:
python setup.py bdist_wheel --universal
這樣會在dist文件夾下生成一個whl文件,
-
6. 上傳生成的包,可以使用setuptools,或者twine上傳,推薦使用twine上次,因為使用setuptools上傳時,你的用戶名和密碼是明文或者未加密傳輸,安全起見還是使用twine吧
# 上傳source 包 python setup.py sdist upload # 上傳pre-compiled包 python setup.py bdist_wheel upload
使用twine上傳,先安裝twine
sudo pip install twine twine upload dist/*
上次前都會提示你前面注冊的用戶名和密碼。一切搞定,你的包現在可以通過pip在任何地方安裝了。
后續
其實對於一個包,你要長久維護,自動測試肯定要加入,后面有時間再分享下如何使用tox的使用和與第三方CI的集成。
引用鏈接:
pypi詳細教程: https://packaging.python.org/distributing