如何創建自己的python包


寫過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,這樣上面兩個問題都不存在了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM