使用 pip 发布 Python 程序

简介: pypi写过 Python 程序的小伙伴们都知道,需要 import 个非 Python 自带的软件包时,都要用到 pip 这个程序。平时我们都是用 pip,如果我们写好了一个程序,想让大家都能用的到,那么是不是也可以通过 pip 发布出去呢?答案当然是可以了,这篇文章我们就来看看如何用 pip 发布一个 python 程序。
img_fb0515f1ece73bd095f44e059c5d6eae.png
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/

img_135bfbb94e7a7dd64f036eab30ad2d2a.png
pypi

注册后还需要进行邮箱验证,流程和普通网站没有任何区别,所以具体步骤就不在这里详细介绍了。

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'

最后再补充一点,上传可能会失败,提示无法上传指定的代码包,此时很大的可能是 pypi 中已经有了相同的代码包,所以建议在上传之前,先搜索一下是否有重名的代码包,选择一个不冲突的名字,再上传。

例如下面这个例子,example-pkg 已经存在了,如果要再上传,那当然会失败,换个名字就解决了。

$ pip search example-pkg
example-pkg (0.0.7)                                            - A small example package
......

5. 参考文档

目录
相关文章
|
1天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
7 3
|
4天前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
13 3
|
20天前
|
IDE 开发工具 Python
Python 编程入门:打造你的第一个程序
【10月更文挑战第6天】编程,这个听起来高大上又充满神秘感的领域,其实就像学习骑自行车一样。一开始你可能会觉得难以掌握平衡,但一旦你学会了,就能自由地穿梭在广阔的道路上。本文将带你走进 Python 的世界,用最简单的方式让你体验编写代码的乐趣。不需要复杂的理论,我们将通过一个简单的例子——制作一个猜数字游戏,来实践学习。准备好了吗?让我们开始吧!
|
23天前
|
存储 JSON 安全
面向企业应用程序的 Python 配置管理
面向企业应用程序的 Python 配置管理
25 9
|
20天前
|
资源调度 前端开发 JavaScript
Python学习二:Python包管理器pip
这篇文章介绍了Python包管理器pip的基本概念、基本操作、如何更改下载源为国内镜像以加速下载,以及如何指定安装包的位置。
19 0
Python学习二:Python包管理器pip
|
23天前
|
人工智能 数据挖掘 程序员
Python 编程入门:打造你的第一个程序
【10月更文挑战第3天】编程,这个看似高深莫测的技能,实际上就像学骑自行车一样,一旦掌握,便能开启全新的世界。本文将带领初学者步入Python编程的殿堂,从基础语法到编写实用程序,一步步解锁编程的乐趣。
|
29天前
|
存储 UED Python
Python编程入门:打造你的第一个程序
【9月更文挑战第36天】在数字时代的浪潮中,编程已成为一项基础技能。本文以Python语言为例,通过构建一个简单的计算器程序,引领初学者步入编程的世界。从基础语法到实现功能,我们将一步步解锁编程的乐趣。无论你是编程新手还是想扩展知识边界的爱好者,这篇文章都将为你打开一扇通往编程世界的大门。让我们开始这段旅程,探索代码的魅力吧!
|
27天前
|
Python
pip批量安装Python库 requirement.txt 离线环境无互联网环境下pip安装Python库
pip批量安装Python库 requirement.txt 离线环境无互联网环境下pip安装Python库
71 3
|
26天前
|
Python
Python编程---双色球选购程序
Python编程---双色球选购程序
20 1
|
27天前
|
小程序 iOS开发 MacOS
将Python代码转化为可执行的程序
将Python代码转化为可执行的程序
20 1

热门文章

最新文章