python中我們經常會用到第三方的包作爲工具,比如爬蟲解析工具beautiful soup,網絡請求工具requests,之所以要把它封裝成包,一是爲了技術與業務分離,二是爲了能多項目多平臺共用,即"write one, do everywhere"。python裏面用到的第三方工具包基本都是從Pypi.org裏面下載的,那我們就來看看怎麼打一個自己的包並上傳到pypi作爲工具使用。
本文假定你一定有一定的python基礎,並懂得怎麼安裝使用第三方工具包,其實也很簡單,安裝包就是要先再本地環境安裝pip,然後如果要安裝其他工具包的話就使用指令(沒有權限就要使用sudo):
pip install <package name>
下面就開始說怎麼打一個自己的包並上傳到pypi了
比如我們要打包一個名字要sghello的包,首先創建一個項目(項目名隨便取,不需要與包名sghello相同),項目的層級結構如下(完整的層級結構,dist是打包時候生成的):
:
首先在新建一個sghello的文件夾作爲項目包,在項目下創建src包和setup.py文件,setup.py結構如下:
from distutils.core import setup
from setuptools import find_packages
setup(name = 'sghello', # 包名
version = '2019.03.09', # 版本號
description = '',
long_description = '',
author = '',
author_email = '',
url = '',
license = '',
install_requires = [],
classifiers = [
'Intended Audience :: Developers',
'Operating System :: OS Independent',
'Natural Language :: Chinese (Simplified)',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.5',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.2',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Topic :: Utilities'
],
keywords = '',
packages = find_packages('src'), # 必填,就是包的代碼主目錄
package_dir = {'':'src'}, # 必填
include_package_data = True,
)
#!/usr/bin/env python
幾個重要參數說明:
- version - 這個簡單,就是包的發佈的版本,可以直接寫在這,也可以從其他地方引用過來
- long_description - 包的介紹,因爲這個裏面的內容是顯示在pypi包首頁上
- packages - 申明你的包裏面要包含的目錄,比如 ['mypackage', 'mypackage_test']
- install_requires - 申明依賴包,安裝包時pip會自動安裝:格式如下(我上面的setup.py沒有這個參數,因爲我這不依賴第三方包:))
install_requires=[
'six>=1.5.2',
'parsel>=1.1',
'PyDispatcher>=2.0.5',
'service_identity',
]
然後在src包下建一個__init__.py和sghello包(最後的包名叫sghello這裏的包就命名爲sghello),__init__.py裏面什麼都不用寫,是python包的結構規範。
接着在sghello包下建.py的模塊文件去實現你這個包所要實現的功能,比如上圖中的hello.py,就實現一個hello效果,就跟平常寫python模塊一樣,隨便寫邏輯:
def testPrint():
print("hello package sghello!!")
最後在sghello包下再建一個__init__.py文件,內容如下:
from __future__ import absolute_import
from .hello import *
__version__ = '1.0.0'
__license__ = ''
其中第一句 from __future__ import absolute_import 必不可少,from .模塊名 import * 是導入你所寫的模塊(所有寫的模塊都要導入),否則這個模塊就不能被識別。
然後再回到項目所在主目錄,也就是第一步中創建的setup.py文件目錄,開始打包了:
完成後會生成一個dist目錄,裏面的壓縮包就是等會要上傳到pypi.org的包,此外src目錄下會生成一個sghello.egg-info的文件夾,這是包的一些說明文件,可不管。
接下來就是去https://pypi.org/account/register/註冊賬號,如果有賬號的請忽略,記住你的賬號和密碼,後面上傳包會使用。
接下來就是上傳你的包了,這裏使用twine上傳,如下:
##沒有就先安裝
sudo pip install twine
#上傳包,期間會讓你輸入註冊的用戶名和密碼
twine upload dist/*
上傳完成了會顯示success,我就不演示了,然後再pypi.org上就可以看到你的包了,如下:
如果要使用的話就在本地使用pip install sghello就可以使用了,大功告成,收工!!