python打包及支持pip安装

目录

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个步骤,如下:

  • Configure: package_test 的文件和目录组织
  • Package: 打包 package_test
  • Distribute: 把打包后的 package_test 发布到 Pypi 中

1.Configure: package_test 的文件和目录组织

注意:

(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.cfg: setup.py 的配置文件,其格式为 INI
  • README.rst: reStructuredText 格式的文件,用于介绍项目
  • MANIFEST.in: 记录某些需要被打包但未被 setup.py 包含的文件,其格式和规范请见 The MANIFEST.in template

setup.py 

setup.py 有两个非常重要的函数:

  • setup(): 该函数囊括了打包的参数和信息
  • 打包命令的入口: python setup.py –help 可以查看可用的命令

本例 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='xxxx@163.com',  # 替换为你Pypi账户名绑定的邮箱

    url='https://github.com/RongSong1993/zhiyundemo',   # 这个地方为github项目地址,貌似非必须
    packages=setuptools.find_packages(),
    license='MIT'
)
  • name: 即项目名称,本例为 packagedemo
  • version: 即版本号,关于版本号的取法请见 Choosing a versioning scheme
  • keywords: 描述项目的关键字
  • description: 项目简介
  • long_description: 项目详细介绍
  • author: 作者名称
  • author_email: 作者邮箱
  • url: 项目的 homepage
  • packages: 项目包括的 python package,setuptools.find_packages() 可自动找出包含的 package
  • license: 如 MIT, APACHE, GNU 等

本例暂未用到如下参数,这些参数的使用请见参数使用

  • classifiers:
  • install_requires:
  • package_data:
  • data_files:
  • scripts:
  • entry_points
  • console_scripts:

setup.cfgMANIFEST.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

2. Package: 打包 package_test

通过步骤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                           |
+---------------+--------------------------------------------------------+

3. Distribute: 把打包后的 package_test 发布到 Pypi 中

说明:如果为公司内部代码,或者不想公开,可以忽略可以第三步,直接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 = <username>
password = <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,如下图所示:

参考地址

  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rs勿忘初心

您的鼓励将是我的最大创动原动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值