查看原文
其他

打造轮子上传到PYPI

seqyuan seqyuan 2022-06-07

我们经常以pip install package的形式安装python包,很多新同鞋有这样的疑问:怎样编写python包(自己造轮子)分享给别人,让别人也可以用pip的形式进行安装使用呢?

要解决这个问题我们要从两方面入手:

  • 写一个python包

  • 规范包的内容上传到PYPI

编写一个python包

为了言之有物我们决定编写一个能解决实际应用的包:

很多时候我们使用linux集群为了安全考虑在登录节点和计算节点不能连接互联网,只能由某个计算节点切换到跳转节点,在跳转节点才能访问互联网。为了使这种连续跳转节点执行命令的操作更加简洁容易,我们决定编写一个叫multiJump的包。

首先我们编写好单独的脚本https://github.com/seqyuan/multiJump/blob/master/multiJump/multiJump.py

其实我们要把multiJump.py作为一个模块供其他程序例如sendmail.py使用,只需要把multiJump.py放在sendmail.py相同的目录下,然后在sendmail.py里写下 importmultiJump就能使用multiJump.py里的类或者函数。

要使multiJump作为一个包存在,我们还需要搭配一定的目录结构,__init__.py可以是个空文件:

  1. .

  2. |————multiJump

  3. |    |___ __init__.py

  4. |    |___ multiJump.py

规范包的内容上传到PYPI

详细的规范请见官方网页https://docs.python.org/2/distutils/setupscript.html,要符合上传到PYPI的规范,我们还需要对前面构建的multiJump目录结构再做一些调整。

  1. .

  2. |————multiJump

  3. |    |___ __init__.py

  4. |    |___ multiJump.py

  5. |————COPYING.txt

  6. |————README.rst

  7. |————setup.py

我们可以看到新的目录结构多了3个文件:

  • COPYING.txt 就是授权文件,里面是你关于这个包的授权,比如:MIT license,那么你里面放入MIT License全文即可,这个License获得方式可以在PYPI上搜一个你记得名字的包,把它的COPYING.txt直接copy过来就行。当然,如果你不清楚这个License是什么意思,你完全可以不要这个文件。

  • README.rst 对于包的说明文件,推荐用rst格式编写(因为不支持markdown)

  • setup.py 核心文件


来看看setup.py是怎么写的:

  1. import codecs  

  2. import os,sys

  3. from setuptools import (

  4.    setup,

  5. )

  6. def read(fname):

  7.    return codecs.open(os.path.join(os.path.dirname(__file__), fname)).read()

  8.    """

  9.    定义一个read方法,用来读取目录下的文件内容,作为包的描述信息

  10.    我们一般是将README文件中的内容读取出来作为长描述,这个会在PyPI中你这个包的页面上展现出来,

  11.    PyPI上支持.rst格式的文件,PyPI会自动把它转为HTML形式显示在你包的信息页面上

  12.    """

  13. setup(

  14.    name="multiJump",

  15.    version = "0.0.6",

  16.    author="seqyuan",

  17.    author_email='seqyuan@gmail.com',

  18.    url="https://github.com/seqyuan/multiJump/wiki",

  19.    #我在github上建了wiki作为包的使用说明,你也可以根据自己需要填写其他网址

  20.    download_url = "https://codeload.github.com/seqyuan/multiJump/zip/master",

  21.    description="multiple Jump IP do something",

  22.    long_description=read("README.rst"),   #读取README.rst里的内容作为包的详细说明

  23.    license="MIT",

  24.    packages=['multiJump'],

  25.    #执行此包必须要依赖的其他包

  26.    extras_require = {

  27.        'sys' : [ 'sys'],

  28.        'paramiko' : ['paramiko'],

  29.        'socket' : ['socket'],

  30.        'time' : ['time'],

  31.    }

  32. )

setup里各参数的详细说明:

Meta-DataDescription
namename of the package
versionversion of this release
authorpackage author’s name
author_emailemail address of the package author
maintainerpackage maintainer’s name
maintainer_emailemail address of the package maintainer
urlhome page for the package
descriptionshort, summary description of the package
long_descriptionlonger description of the package
download_urllocation where the package may be downloaded
classifiersa list of classifiers
platformsa list of platforms
licenselicense for the package

上传到PYPI前操作

在官网注册一个PYPI账号https://pypi.org/account/register/ 创建用户验证文件 ~/.pypirc

  1. [distutils]

  2. index-servers=pypi

  3. [pypi]

  4. repository = https://upload.pypi.org/legacy/

  5. username = <username> #在PYPI注册的账号

  6. password = <password> #在PYPI注册账号的密码


上传并完成发布

上传命令 python3 setup.py sdist upload

上传结果

https://pypi.org/project/multiJump/

上传到PYPI之后就能用 pip3 install multiJump安装到自己的python库了

multiJump使用方法 

可参见https://github.com/seqyuan/multiJump/wiki 我用它做的第一件应用是跳转到end节点发送邮件。 欢迎下载并使用 multiJump


参考文章:

https://segmentfault.com/a/1190000008663126

https://zhuanlan.zhihu.com/p/26159930

https://blog.csdn.net/crisschan/article/details/51840552


微信号


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存