寫過python的人都知道python最方便也最牛的地方就是它有無數的第三方lib可以直接拿來使用,可以讓編寫代碼變的更容易。
長用的安裝第三方lib的方法有easy_install和pip,這兩個的使用方法大概差不多。這個不是本文要描述的重點,我就簡單寫兩條:
easy_install
安裝新包: easy_install install xxxx
卸載已安裝的包:easy_install uninstall xxxx
更新已安裝的包: easy_install -U xxxx
pip
安裝新包: pip install xxxx
卸載已安裝的包:pip uninstall xxxx
更新已安裝的包: easy_install install xxxx -U
查看已安裝的包: pip list
用distutils制作自己的安裝包
如何讓自己寫的包能被人當作第三方庫安裝呢?請看下面的例子:
mylib.py 文件
def add(x,y): return x+y def division(x,y): return x/y def mutiply(x,y): return x*y def subtract(x,y): return x-y def main(): pass if __name__ == '__main__': main()
簡單的方法可以進入到mylib.py存放的目錄,然后import mylib就可以使用它提供的方法了。但是如果項目比較大,需要很多人協作的話,這樣就非常不方便。這時候可以使用distutils標准庫。於是我們可以在mylib.py同級目錄下再創建一個setup.py,它的內容如下:
from distutils.core import setup setup(name='mylib', version='1.0', py_modules=['mylib'], )
name是指定的包名,version是版本號,py_modules里包含需要安裝的python文件,本例中即為mylib.py文件。
編寫好setup.py后,就可以使用
python setup.py install
把它安裝到系統中了。安裝完后我可以用 pip list 查看已安裝的包的信息,並且在任何地方的python文件中都可以import mylib了。
使用pastescript自動創建項目
那么如何把自己的安裝包上傳到PyPI上,從而像其他安裝包一樣可以試用easy_install 或 pip安裝呢?
這就需要遵循PEP241,給出足夠的元數據才行,比如對包的描述,作者的信息,授權方式,主頁等。需要一個非常復雜的setup.py文件,這時候可以自己手動寫成下面的文件:
from distutils.core import setup from setuptools import setup, find_packages setup( name = 'mylib', version = '0.0.1', keywords = ('simple', 'test'), description = 'just a simple test', license = 'MIT License', author = 'jim', author_email = 'jim@126.com', packages = find_packages(), platforms = 'any', )
然后運行下面的命令,生成一個mylib的包。最后把包含setup.py在內的這一級目錄全部上傳到PyPI上即可。
# 以下所有生成文件將在當前路徑下 dist 目錄中
python setup.py bdist_egg # 生成easy_install支持的格式
python setup.py sdist # 生成pip支持的格式,下文以此為例
有一個第三方庫pastescript可以幫助我們自動創建這樣一個復雜的文件,你只需要回答它的問題就可以了。
首先我們通過
pip install pastescript
安裝 pastescript包,然后就可以使用下面的命令來自動創建一個復雜的setup.py包:
paster create -o mylib-2 -t basic_packge mylib
如果不想回答問題的話也可以提前編輯好配置文件config.cfg
[pastescript] description = This is a test license_name = keywords = test mylib long_description = I am mylib,a test lib for project author = jim author_email = jim@126.com url = www.baidu.com version = 1.0.0
然后使用命令行自動加載
paster create -t basic_package --config="config.cfg" mylib
共享安裝包到PyPI上
上面搞定了安裝包在本地的安裝,那么下面開始把mylib共享到PyPI上,那么肯定需要一個PyPI的帳號,這個自己去注冊吧。
然后進入到剛剛生成的mylib的目錄下,運行
python setup.py register
在系統中填寫我們在PyPI上注冊的信息,包括用戶名、密碼,並把這個包名注冊到PyPI上。(請確保PyPI上沒有同名的包)
完成后再執行
python setup.py sdist upload
將代碼上傳到PyPI。
最后注意幾點:
1. 上傳到PyPI上的包很有可能用pip或easy_install下載失敗,提示can not find a version satisfy request xxxxx. 原因是這個包生成的時候默認是當作dev的,所以不能release,於是要自己手動修改它自動生成的配置文件setup.cfg,把其中的tag_build = dev 改成 tag_build =
2. 經過試用后發現用pastescript生成的包符合PyPI的條件可以上傳,但是它傳上去的只是一個空的包,里面沒有mylib.py這個文件,也許是需要用其他的參數生成包,而不是basic_packge;而自己用python setup.py sdist 生成的包則沒有任何問題。
最簡單的方法就是在生成包的時候使用python setup.py sdist --formats=zip,gztar,這樣上面兩個問題都不存在了
