目录
1.Configure: package_test 的文件和目录组织
2. Package: 打包 package_test
3. Distribute: 把打包后的 package_test 发布到 Pypi 中
pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。
很多时候我们是可以通过类似:pip install xxx命令来安装一些模块,这些模块都是从pypi官网下载并安装的,这些包通常都符合一定的规范,当然除了已有的一些包之外,我们也可以自己按照一定的规范打包我们自己的模块,然后将其上传到PyPi上,然后通过pip intsall xxx(你的模块名) 来安装,下文主要介绍了如何打自己的包及上传,假设你的包名称为package_test,主要分为3个步骤,如下:
注意:
(1)文件目录组织:包含目录组织规范、某些必需的文件
(2)setup.py:打包的参数信息
首先我们来初始化文件,假设你的包名称为package_test,这是一个非常简单的application,其目录和文件名称如下所示,你需要按照这个结构创建相应的文件夹及目录
package_test
├── setup.py
├── setup.cfg
├── README.rst
├── MANIFEST.in
└── package_test
├── __init__.py
└── main.py
可以看出,package_test的根目录必需包含4个基本文件“
setup.py
setup.py 有两个非常重要的函数:
本例 setup.py 文件的内容如下:
注意替换里面的部分参数,已注释说明,在https://pypi.org/创建账户
# -*- coding: UTF-8 -*-
import os
import setuptools
setuptools.setup(
name='my_demo',
version='2019.03.31',
keywords='demo',
description='A demo for python packaging.',
long_description=open(
os.path.join(
os.path.dirname(__file__),
'README.rst'
)
).read(),
author='xxxx', # 替换为你的Pypi官网账户名
author_email='[email protected]', # 替换为你Pypi账户名绑定的邮箱
url='https://github.com/RongSong1993/zhiyundemo', # 这个地方为github项目地址,貌似非必须
packages=setuptools.find_packages(),
license='MIT'
)
本例暂未用到如下参数,这些参数的使用请见参数使用
setup.cfg 和 MANIFEST.in 在本例中均为空文件。
README.rst 文件的内容如下:
===========
package_test
===========
This project provides a demo for packaging and distributing python application.
package_test/__init__.py 为空文件,package_test/main.py 文件的内容如下:
# -*- coding: UTF-8 -*-
print "hello, this is a package demo by rs"
def max_number(a, b):
if a > b:
return a
else:
return b
通过步骤1,我们已经按照一定的规范准备好了我们的包文件,那接下来如何打包呢?
采用 pip 可安装 source distribution(sdist) 和 wheels 这两种格式 python package,如果二者同时存在,pip 优选选择 wheel。
Source Distribution:
采用如下命令即可编译成 source distribution:
$ python setup.py sdist
running sdist
running egg_info
creating package_test.egg-info
writing packagedemo.egg-info/PKG-INFO
...
creating dist
Creating tar archive
removing 'packagedemo-2019.03.31' (and everything under it)
$ ls dist/
package_test-2019.03.31.tar.gz
Wheel:
根据 application 包含的代码类型以及其所支持的 python 版本, wheel 格式可细分为三种
采用如下命令可编译成 universal wheel
python setup.py bdist_wheel --universal
采用如下命令可编译成非 universal wheel(即 pure python wheel 或 platform wheel):
python setup.py bdist_wheel
本文采用的是wheel的方式编译的,可能需要你提前:pip install wheel 安装好wheel,如果一切顺利的话,在你的项目路径下会新增部分文件夹及文件,比如最关键的为/dist/package_test-2019.3.31-py2-none-any.whl
Others:
Python application 还可以被编译成其它类型的 package,如 rpm, egg 等,只是这些类型的 package 不被 pip 支持。
+---------------+--------------------------------------------------------+
| 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 |
+---------------+--------------------------------------------------------+
说明:如果为公司内部代码,或者不想公开,可以忽略可以第三步,直接pip install package_test-2019.3.31-py2-none-any.whl来安装你打包好的.whl文件即可,当然安装的时候需要注意.whl文件的路径,笔者是在上述.whl所在路径下执行的上述安装命令,因此可以找到相应的.whl文件。如果你想发布的包到Pypi,以后直接执行pip install package_test来安装你打好的包,请继续往下看:
安装 twine,用于上传打包好的 package 至 Pypi:
pip install twine
1 . 在 Pypi 创建一个账户。
2 . 上传至 Pypi:
创建如下配置文件 ~/.pypirc(终端执行:touch ~/.pypirc创建文件),内容如下:
注意:(1)~/.pypirc文件位置为你所创建项目所在的路径
(2)~/.pypirc文件中的username和passwork为你在 Pypi 上创建的用户及其密码
[distutils]
index-servers=pypi
[pypi]
repository = https://pypi.python.org/pypi
username =
password =
3.终端执行上传操作,命令如下:
twine upload dist/*
如果显示上传成功没有报错,说明上传成功了,如果报错的话可以根据额提示信息检查,我们可以在 Pypi 上查看自己上传的包
4.测试所上传的包是否可用
在终端执行如下命令,预期成功
pip install package_test
这个是时候我们可以检查下这个包是否已经下载并存在于我们的计算机中,一般默认可以在/usr/local/lib/python2.7/site-packages/目录下找到你新装的包,当然这个路径得由你现在所使用的python具体的安装位置所决定,相信你可以找到的
然后终端直接输入:python,进入python交互终端
接着导入你的模块,输入:import package_test.main
最后使用模块中的函数,终端输入: package_test.main.max_number(4,5)
预期输出结果为5,如下图所示:
参考地址