朱琛的小屋

制作一个python egg 并发布到PyPI

最近写了一个可以在终端上输出ASCII表的Python公共库PrintTable,GitHub地址github PrintTable

最后将脚本打包并且发布到PyPI的过程也是挺长的,第一次学习记录一下。

1. Python脚本 -> 包

首先我们先构建出自己包的架构。这里拿PrintTable这个项目的文件结构举例。

├── LICENSE
├── MANIFEST.in
├── printtable
│   ├── __init__.py
│   ├── printtable.py
├── README.md
├── setup.cfg
├── setup.py

LICENSE:版权信息文件
MANIFEST.in:打包时不会被自动包含进去的附加文件清单
printtable:Python程序,我们要注意这个文件夹里必须有__init__.py这个文件。即使里面是空的。这样做是为了防止某些目录有一个共同的名字。
README.md:项目说明文件
setup.py:安装程序文件
setup.cfg:包含setup.py额外配置信息的文件

其中setup.py是我们主要需要配置的文件。

from setuptools import setup, find_packages

setup(
    name = 'printtable',
    version = '1.0',
    keywords = ('print table'),
    description = 'a library for drawing the table in the terminal',
    license = 'MIT License',
    url = 'https://github.com/prozhuchen/PrintTable',
    author = 'prozhuchen',
    author_email = 'prozhuchen@gmail.com',
    packages = find_packages(),
    include_package_data = True,
    platforms = 'any',
    install_requires = [],
)

上面这些配置信息一般已经够我们用了,如果需要更多的话,setup.py配置信息这是官方文档中setup.py的详细配置信息介绍。

MANIFEST.in文件包含了一些打包时不会被自动包含进去的附加文件。其中最广泛包含进去的是README.md,因为这个项目说明文件打包时不会被自动包含进去。

include README.md

2. 打包

通过执行下列语句来进行打包:

python setup.py xxx

其中xxx可以是下列几种方式中其中一个:

sdist             create a source distribution (tarball, zip file, etc.)
bdist             create a built (binary) distribution
bdist_dumb        create a "dumb" built distribution
bdist_rpm         create an RPM distribution
bdist_wininst     create an executable installer for MS Windows
bdist_egg         create an "egg" distribution

举个例子:

python setup.py sdist #生成的文件支持 pip

此时在根目录出现了dist文件夹,里面有name-version.tar.gz这个文件,这就是我们要发布到PyPI的压缩包了。

3. 发布到PyPI

首先我们需要在PyPI上注册一个帐号,你可以选择PyPI注册页面和命令行注册两种方式:

$ python setup.py register -r pypi

running register
running egg_info
writing printtable.egg-info/PKG-INFO
writing top-level names to printtable.egg-info/top_level.txt
writing dependency_links to printtable.egg-info/dependency_links.txt
reading manifest file 'printtable.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'printtable.egg-info/SOURCES.txt'
running check
We need to know who you are, so please choose either:
 1. use your existing login,
 2. register as a new user,
 3. have the server generate a new password for you (and email it to you), or
 4. quit
Your selection [default 1]: 
1
Username: prozhuchen
Password: 
Registering prinble to https://pypi.python.org/pypi
Server response (200): OK
I can store your PyPI login so future submissions will be faster.
(the login will be stored in /home/zc/.pypirc)
Save your login (y/N)?y

当你注册完毕后,会在用户根目录下创建文件~/.pypirc,这样以后就不需要输入帐号密码了。

然后我们需要向PyPI上发布自己的源代码包。

$python setup.py sdist upload 
...
Creating tar archive
removing 'printtable-1.0' (and everything under it)
running upload
Submitting dist/printtable-1.0.tar.gz to https://pypi.python.org/pypi
Server response (200): OK

此时在网页上就可以看到自己的源代码包啦。

现在我们使用pip install packagename,就可以使用我们自己写的Python库了。

每次我们想更新我们自己的库时,只需要更新代码文件夹内的代码和setup.py里的version即可。

4. 注意

每次上传时,我们的名字或者版本号两者有一个必须和以前的不一样,也就是打包生成的name-version.tar.gz名字和以前上传的压缩包不一样才行。覆盖是行不通的哦。

朱琛 wechat
扫一扫,用手机看更方便~
坚持原创技术分享,您的支持将鼓励我继续创作!