昨天无意之间看到博客上有人说向PYPI上传了自己写的包,就觉得挺好有意思的,于是自己也尝试了一下。
因为上传到PYPI就意味着,以后就可以用pip install
命令来安装你写的包了,全世界都可以使用。
所以这里记录一下上传的过程。
1.编写代码&文档
这个不用多说。我这里正好把之前编写过的视频、图像处理的几个函数给整合到了一块。并给包起了个名字叫RStoolkit
。
之前是自己用,但现在是给别人用,所以函数说明就必须要写完善,否则别人根本不知道如何使用。因此每个函数都写了详细的使用说明,如下。 这里的格式是自动生成的。在你定义的函数名称下面连续输入三个双引号,然后再按回车,PyCharm即可自动生成标准格式的函数说明,然后往里面填内容即可。 一般遵循的规则是文档字符串是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。 由于考虑到使用者和字符编码的问题,所以就用英文写了。
代码其实之前都已经写过相关博客介绍了。不过还是把它们重新在Github上上传了个项目。 项目地址:https://github.com/zhaoxuhui/RStoolkit
项目的组织结构是大的包名叫”RStoolkit”,然后下面目前又分了3个小的包,分别对应不同功能。
- image:主要是与图像处理相关的函数
- video:主要包括视频处理相关的函数
- common:包含一些基础、公共的函数
同时整个包主要依赖OpenCV和GDAL两个第三方包。
2.注册账户
在PYPI官网的右边有”Sign in”,https://pypi.python.org/pypi,按照提示进行注册即可。完成后会有激活邮件,激活即可。
3.打包准备
首先,将你写的所有代码文件(.py)文件新建个文件夹放在一起,并在这个文件夹下新建一个__init__.py
的空文件,如下所示。
然后,再在这个文件夹外面建一个同名文件夹,并且在新建的这个文件夹下放置包相关信息文件,如下。
主要放”COPYING.txt”,这是版权文件,这里我用的MIT。具体可以百度,把内容粘贴在这里面即可。
然后是”README.txt”,帮助文档。可以写关于包的说明、介绍、使用注意事项等。要求是使用rst(reStructuredText)格式,具体rst的语法可以参考:https://rest-sphinx-memo.readthedocs.io/en/latest/ReST.html。但如果没有什么特别的格式需求,只是一些文字,用普通的txt代替也可以。
“requirments.txt”是要求文件,也即要运行此包,需要哪些环境或包。这个不是必须的,但有了它们,用户可以使用命令pip install -r requirements.txt
自己手动安装依赖包。
最后是最最重要的”setup.py”,这里面需要填写很多东西,有如下内容。
import codecs
import os
import sys
try:
from setuptools import setup, find_packages
except:
from distutils.core import setup
def read(fname):
return codecs.open(os.path.join(os.path.dirname(__file__), fname)).read()
setup(
name = "RStoolkit",
version = "1.0.3",
description = "A powerful and useful package for remote sensing image&video preocessing.",
long_description = read("README.txt"),
classifiers =
[
'License :: OSI Approved :: MIT License',
'Programming Language :: Python',
'Operating System :: OS Independent',
'Topic :: Scientific/Engineering :: Astronomy',
'Topic :: Scientific/Engineering :: GIS',
'Topic :: Scientific/Engineering :: Mathematics',
'Intended Audience :: Science/Research',
'Intended Audience :: Developers',
'Intended Audience :: Information Technology',
],
install_requires=
[
'opencv-python>=3.1.0',
'gdal>=2.1.4',
],
keywords = "RemoteSensing Image Video",
author = "zhaoxuhui",
author_email = "zhaoxuhui@whu.edu.cn",
url ="https://github.com/zhaoxuhui/RStoolkit",
license = "MIT",
packages = find_packages(),
include_package_data= True,
zip_safe= True,
)
但其实填起来也很简单,基本只需照着把信息改成自己的就可以了。这里需要注意的有几点。
首先是classifiers
,这里面的内容不是我自己写的,而是在>这个网站<上找,然后贴进来的。
你可以把它理解为一个个标签,说明了包的各种属性。
然后install_requires
,这个属性表示pip将要自动安装的包。如果用户电脑上没有,那么pip就会自动按照你这里的要求去下载并安装包。这也就是用pip最方便的地方,让用户觉得“智能”的地方。其实都是程序员事先写好了的,只是用户不知道而已。
packages
这个属性表示当前包依赖哪些第三方包,是一个list类型。可以手动指定,也可以调用find_packages()
函数自动寻找。
然后我们可以用python setup.py check
命令检查是否有问题,如果没有报错就说明认可你的内容,可以上传了。否则按照提示修改即可。
注意这些命令还有下面的命令都是在setup.py所在的目录下运行的。在完成这些工作以后,打包的准备工作就完成了,下一步就是打包上传了。
4.打包上传
有两种不同打包方式,一种是源码包(以tar.gz结尾),一种是wheel包(以.whl结尾),打包好的文件放在dist目录下。分别有不同命令。
对于源码包,打包命令是:
python setup.py sdist build
然后,如下命令上传。
python setup.py sdist upload
对于wheel包,打包命令是:
python setup.py bdist_wheel --universal
上传命令是:
python setup.py bdist_wheel upload
不过需要注意的是,上传最好在Linux系统上传。在Windows下总会报授权错误之类的错误,比较麻烦。我在Windows下试了好久没有找到解决办法。 在Linux下首次上传也需要配置个东西。首先需要创建用户验证文件”.pypirc”,内容如下:
[distutils]
index-servers =
pypi
pypitest
[pypi]
username:xxx
password:xxx
替换成自己的信息,然后将这个文件放在系统的根目录下,也即”./”目录。然后就可以打开终端,输入命令上传了。
在上传过程中可能会要求输入用户名密码什么的,按照提示输入即可。成功以后,就可以在PYPI登陆,然后就能看到自己的包了。
到这里,上传工作就完成了。以后你就可以使用pip install RStoolkit
来安装和使用这个包了。
5.测试
如图,由于我们前面在install_requires
中指定了依赖,所以在安装时PIP会自动检查是否有这两个包,如果没有则下载安装。
不过这里有个问题需要注意。就是GDAL的库并不太好安装,直接使用pip install gdal
很有可能会失败。
因为安装的是源码包,所以在安装前会编译,而编译又需要用到其它依赖,所以失败的可能性很大。
对于这个问题,在README里也有说明。
如果你是Windows用户,那么你可以在>这个网站<搜索下载对应的GDAL预先编译好的wheel包,然后本地安装即可,一般不会出现问题。
[2018-8-7补充:这个网站似乎已经挂掉了,现在这个方法不能用了。]
或者,如果你使用Anaconda环境,那么你可以直接conda install gdal
,Anaconda会自动帮你编译、安装好GDAL,然后就可以用PIP装RStoolkit了。
[2018-8-7补充:有时可能会出现安装成功,但使用时报找不到DLL的错误。这主要是因为虽然Conda把GDAL包给装了,但是并没有安装完全依赖的DLL。
所以解决办法就是按照这篇博客中提到的,安装一下GDAL Core,基本就能解决问题了。]
如果你是Linux用户,目前好像并没有编译好的轮子,所以只能你自己按照指导一步步配环境然后再编译、安装了。 但如果你也使用Anaconda,那么就和Windows用户一样,一个命令即可搞定。所以这里还是推荐使用Anaconda环境,确实很方便、省事。
更多有关于PYPI上传包的内容可以点击>官方文档<查看,这里只是介绍了最基本的东西。
本文作者原创,未经许可不得转载,谢谢配合