专栏首页blackpiglet使用 pip 发布 Python 程序

使用 pip 发布 Python 程序

pypi

写过 Python 程序的小伙伴们都知道,需要 import 个非 Python 自带的软件包时,都要用到 pip 这个程序。平时我们都是用 pip,如果我们写好了一个程序,想让大家都能用的到,那么是不是也可以通过 pip 发布出去呢?

答案当然是可以了,这篇文章我们就来看看如何用 pip 发布一个 python 程序。

1. 环境准备

要用 pip 发布 python 程序,首先当然是要安装 Python 和 pip 这两个软件了,以 Ubuntu 16.04 为例:

$ sudo apt update 
$ sudo apt install -y python python-pip

CentOS 和 RedHat 因为 RPM 体系需要依赖于 python,更是默认就安装好了。

另外发布 Pypi,还需要安装一个发布工具,twine,以及其所依赖的 setuptools、wheel:

$ sudo pip install --upgrade twine setuptools wheel

好,到这环境就已经就绪了。

2. 注册帐号

pip 上传代码包是最终保存在 https://pypi.org 这个网站上的,所以要用 pip 发布程序,就需要在这个网站上注册一个帐号。

访问该网址进行注册:https://pypi.org/account/register/ [图片上传失败...(image-68efd2-1537870722761)] 注册后还需要进行邮箱验证,流程和普通网站没有任何区别,所以具体步骤就不在这里详细介绍了。

3. 代码结构

要发布 Python 程序,程序的结构必须符合特定的要求,假设要发布的程序名为 example-pkg,基本的目录结构如下:

/example-pkg
  /example-pkg
    __init__.py
  setup.py
  LICENSE
  README.md

说一下目录和文件的含义:

  • 首先最外层要建立一个和发出程序同名的文件夹:/example-pkg
  • 该文件夹下还要再简历一个同名文件夹,用来存放程序代码:/example-pkg/example-pkg
  • Python 的老规矩,example-pkg/example-pkg 目录下当然要有一个 __init__.py 文件。
  • /example-pkg 目录下要有一个叫 setup.py 的文件,如果下载过 Python 代码包,应该都知道这个文件,需要通过这个文件进行 Python 代码的编译(可能会有依赖的其他代码包或者依赖的 C 文件)和安装。
  • LICENSE 文件:这个文件就是用来保存代码所使用的开源许可证。
  • README.md:这个是软件通信的管理了,帮助文档。

对于 setup.py 文件,还有必要好好说说,先贴个例子,下面这个例子中,主要是实现了从 /example-pkg/example-pkg/init.py 文件中读取 version 参数,来配置当前软件的版本,并指定了代码包名(name)、作者(author)、邮箱(author_email)、描述信息(long_description、long_description_content_type)、依赖(install_requires),以及哪些文件不会被打包到程序中(exclude_package_data)。

另外需要提醒大家一点,给程序起名字不要带下划线(_),python import 代码包时是不支持下划线,出现这种情况就比较尴尬了,代码装上了,还是用不了。

#!/usr/bin/env python

import re
import setuptools

version = ""
with open('example-pkg/__init__.py', 'r') as fd:
    version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]',
                        fd.read(), re.MULTILINE).group(1)

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="example-pkg",
    version=version,
    author="example",
    author_email="author@example.com",
    description="This is the SDK for example.",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="http://example.com",
    install_requires=[
        'requests!=2.9.0',
        'lxml>=4.2.3',
        'monotonic>=1.5',
    ],
    packages=setuptools.find_packages(exclude=("test")),
    classifiers=(
        "License :: OSI Approved :: MIT License",
        "Intended Audience :: Developers",
        "Operating System :: OS Independent",
        "Programming Language :: Python",
        "Programming Language :: Python :: 2",
        "Programming Language :: Python :: 2.6",
        "Programming Language :: Python :: 2.7",
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.3",
        "Programming Language :: Python :: 3.4",
        "Programming Language :: Python :: 3.5"
    ),
    exclude_package_data={'': ["example-pkg/test.py", "example-pkg/config.txt"]},
)

4. 上传和检查

一切准备就绪,下面就可以执行打包命令,产生要上传的代码包了:

$ python setup.py sdist bdist_wheel

执行结束后,会产生如下目录和文件:

/example-pkg/dist/
  example-pkg-0.0.1-py3-none-any.whl
  example-pkg-0.0.1.tar.gz

包有了,就差上传了,执行第一步中安装的 twine 命令:

$ twine upload dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Enter your username: <your pypi.org username>
Enter your password: <your pypi.org password>
Uploading example-pkg-0.0.1-py3-none-any.whl
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 45.0k/45.0k [00:01<00:00, 24.0kB/s]
Uploading example-pkg-0.0.1.tar.gz
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 43.8k/43.8k [00:00<00:00, 46.2kB/s]

上传完毕!不过这里有一点需要注意,上传新版本后,很可能 pip search 还没法查到版本的更新,这是正常的,我理解是 pip search 命令依赖于缓存,所以不会立刻生效。

接下来就让我们下载自己刚刚上传的 python 试试吧:

$ pip install example-pkg
$ python
>>> import example-pkg
>>> example-pkg.name
'example-pkg'

5. 参考文档

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)

      这是系列文章的第三篇。下面是另外两篇的链接: 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务(一) 如何使用 Gin 和 Gorm 搭建一...

    用户2443625
  • R语言实战第一,二章SQL版环境准备导入数据查询注册90天内购买的用户数量查询90天内未购用户和收到短信的比例

    这是之前使用R语言完成的一道简单的数据统计题目链接: https://zhuanlan.zhihu.com/p/27092971

    用户2443625
  • DNSMasq 域名解析配置

    DNSMasq 主要用来解决内网 DNS 域名缓存、DHCP、网络启动和路由通告功能,本文主要是将 DNSMasq 作为内网 DNS 使用。安装环境为 Ubun...

    用户2443625
  • JavaScript之DOM

    一、什么是DOM? DOM (Document Object Model)是指文档对象模型,通过它,可以访问HTML文档的所有元素。 DOM(Docum...

    人生不如戏
  • 【周语录】工业4.0时代,智能将成为新生产要素

    【数据猿导读】 智能将成为与土地、劳动、资本具有同等重要地位的新生产要素,智能社会将是继农业社会、工业社会、信息社会之后出现的一种高级社会形态 编辑 | sha...

    数据猿
  • 一览群智胡健:在中国完全照搬Palantir模式,这不现实

    神秘的硅谷大数据挖掘公司 Palantir 是国内众多创业公司看齐的标杆,其业务是为政府和金融领域的大客户提供数据分析服务,帮助客户作出判断,甚至“预知未来”,...

    AI科技大本营
  • python基础知识——函数

    函数其实就是一段可以多次调用的代码。 1、函数的定义 格式 def 函数名(参数1[ = 默认值1], 参数2[ = 默认值2], ...): ... ...

    zhaozhiyong
  • dayjs——一个轻量型的日期时间库

    对于日期时间处理,常见有moment.js和date-fns.js等库,然而这些库在个人看来有点大了,而平常人往往只用到其中个别功能,这就有点浪费,当然也可以抽...

    IT晴天
  • python基础知识——函数

    在Python中,任何的变量都是对象,所以参数只支持引用传递的方式,在这样的情况下,形式参数和实际参数都指向的是内存中的同一个存储空间。

    zhaozhiyong
  • JVM性能调优-可视化虚拟机⼯具Jconsole介绍

    cwl_java

扫码关注云+社区

领取腾讯云代金券