创建自己的python模块并上传到pypi

摘要:这篇文章描述了自己动手把需要的代码封装成python模块的方法。完成后,我们可以直接使用pip install xxx下载自己的模块并使用内置的函数。

介绍
python作为一门鼎鼎大名的语言,最有优势的地方就是它拥有无数第三方的模块可以直接拿来使用。以numpy(一个用于实现科学计算的模块)为例,常见的用法一般是这样,相信写过python的肯定是见得多了。

1
2
import numpy
from numpy import core

name 必须是唯一的,允许使用数字和字母,推荐使用中划线 -而不是下划线_,因为pip安装只支持中划线,比如pip install my-pkg,为了不给自己找麻烦请听话。
version推荐遵循语义化版本号规则,简单说就像这样:1.2.0
作者姓名和邮箱地址不一定要和你的PyPI账号一致。

创建pip目录结构

选定的包名在pypi网站上没有使用过,可以访问官网,搜索一下想用的名字有没有被占用。
我的python包名叫做clinicaltrial,目录结构如下:我们先创建空文件,指定以下的名字

1
2
3
4
clinicaltrial/
clinicaltrial/
__init__.py
setup.py

其中主目录是整个包的根目录,setup.py是部署到pip需要的配置文件,子目录clinicaltrial是真正的python代码位置。
我们在__init__.py中写入代码:

1
2
def start():
print("import successful")

然后在setup.py文件中写入以下配置信息(参数里的内容可以修改,可以添加的参数具体可以参考python官方文档)

1
2
3
4
5
6
7
8
9
10
11
from setuptools import setup
setup(name='clinicaltrial',
version='0.1',
description='clinical trial information retriver',
url='http://github.com/tongling/clinicaltrial',
author='Ling',
author_email='tonglingacademic@gmail.com',
license='MIT',
packages=['clinicaltrial','filter'],
zip_safe=False)

然后打开命令行,切换到当前目录,输入

1
pip install .

然后,在我们的系统上,就可以导入这个包了:

1
2
import clinicaltrial
clinicaltrial.start()

测试本地打包命令
如果上面的都没问题,在本地目录执行以下命令应该能成功在dist目录下生成*.tar.gz的包文件。

1
python setup.py sdist

上传并发布包文件到PyPI
创建 PyPI账号
非常简单,直接通过官网注册 https://pypi.python.org/, 但是需要验证邮件并确认激活。

创建用户验证文件 ~/.pypirc
在自己的用户目录下新建一个空白文件命名为.pypirc,内容如下:

1
2
3
4
5
6
7
[distutils]
index-servers=pypi

[pypi]
repository = https://upload.pypi.org/legacy/
username = <username>
password = <password>

用户名和密码就是上一步骤所创建的,直接明文输入。如果你觉得明文密码不安全也可以留空,在后面的上传过程中会提示你手动输入。

注册你的包
你需要到PyPI注册并验证你的包,之后才能开始真正上传,注册的方式有以下几种。

使用命令python setup.py register,最简单但官网不推荐,因为使用的是HTTP未加密,有可能会被攻击人嗅探到你的密码。
通过PyPI网站提交表单完成注册验证。
安装 pip install twine 然后在通过命令 twine register dist/mypkg.whl 完成注册。
上传并完成发布
你可以任选以下两种方式之一发布你的轮子。

使用命令:python setup.py sdist upload,还是和上面一样,简单但有安全隐患,目前已淘汰。
使用 twinetwine upload dist/*
管理你的包
如果你的包已经上传成功,那么当你登录PyPI网站后应该能在右侧导航栏看到管理入口。

1
pypi_manage

点击包名进去后你可以对你的包进行管理,当然你也可以从这里删除这个包。

让别人使用你的包
包发布完成后,其他人只需要使用pip就可以安装你的包文件。比如:

1
pip install package-name

如果你更新了包,别人可以可以通过–update参数来更新:

1
pip install package-name --update