python 如何上传包到pypi


Posted in Python onDecember 24, 2020

有过一定的 Python 经验的开发者都知道,当引入第三方包时,我们常常会使用 pip install 命令来下载并导入包。

那么,如何写一个自己的包,上传到 PyPI 呢,其他开发者也可以通过 pip install 命令下载并导入?

本文提供了最简单的示例。

准备好项目目录

创建一个项目目录,其目录结构如下:

/packaging_tutorial
 /example_pkg
  __init__.py

其中,packaging_tutorial 是一个文件目录,example_pkg 是一个你希望上传的 Python 包。

注:本人使用的是 virtualenv + virtualenvwrapper 构建的 Python 虚拟环境,因此 python 和 pip 命令(而非 python3 和 pip3)直接对应的是我所指定的虚拟环境(Python 3.6.7)。

创建一些必要文件

再向 packaging_tutorial 中创建一些文件。其目录结构如下:

/packaging_tutorial
 /example_pkg
  __init__.py
 setup.py
 LICENSE
 README.md

创建 README.md 文件

在 README.md 可以输入一些介绍项目的文档。

# 测试

这只是一个测试。

- 测试 1
- 测试 2
- 测试 3

创建 setup.py 文件

setup.py 是 setuptools 的构建脚本,它提供了包的各种信息。

在 setup.py 中输入以下代码:

import setuptools

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

setuptools.setup(
  name="example-pkg-your-username",
  version="0.0.1",
  author="Example Author",
  author_email="author@example.com",
  description="A small example package",
  long_description=long_description,
  long_description_content_type="text/markdown",
  url="https://github.com/pypa/sampleproject",
  packages=setuptools.find_packages(),
  classifiers=[
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
  ],
)

各个配置的字段的含义应该是不言而喻的,如果想了解更多,参见官网解释。

创建 LICENSE

LICENSE 是项目所遵循的许可证,以 MIT 为例:

Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

存档发布版本

一般来说,pip 默认应该都安装了 setuptools 和 wheel。如果没有安装,则安装之:

pip install setuptools wheel -i https://pypi.douban.com/simple

如果安装需要更新,则更新之:

pip install --upgrade setuptools wheel -i https://pypi.douban.com/simple

安装好最新版本后,在 setup.py 所在目录下输入:

python setup.py sdist bdist_wheel

这个命令会在生成一个 dist 目录,里面有两个文件:

dist/
 example_pkg_your_username-0.0.1-py3-none-any.whl
 example_pkg_your_username-0.0.1.tar.gz

tar.gz 是源文件存档,whl 是构建的发布版本。

上传发布版本

安装 twine:

pip install twine -i https://pypi.douban.com/simple

安装好之后,执行 twine 命令(这里,需要注意你已经注册了 PyPI 的账号):

twine upload dist/*
Enter your username: heyulong 
Enter your password: 
Uploading distributions to https://upload.pypi.org/legacy/
Uploading example_pkg_heyulong-0.0.1-py3-none-any.whl
100%|??????????????????????????????????????| 5.49k/5.49k [00:01<00:00, 4.66kB/s]
Uploading example-pkg-heyulong-0.0.1.tar.gz
100%|??????????????????????????????????????| 4.23k/4.23k [00:01<00:00, 2.21kB/s]

执行完之后,即可在 PyPI 官网上看到自己上传的项目了。

安装你上传的 PyPI 项目,比如我的:

pip install example-pkg-heyulong

这里简单介绍了上传 PyPI 项目的过程。更多细节请关注 PyPI 官网。

以上就是python 如何上传包到pypi的详细内容,更多关于python 上传包到pypi的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
400多行Python代码实现了一个FTP服务器
May 10 Python
Python操作json数据的一个简单例子
Apr 17 Python
通过mod_python配置运行在Apache上的Django框架
Jul 22 Python
解读Django框架中的低层次缓存API
Jul 24 Python
Python中列表、字典、元组数据结构的简单学习笔记
Mar 20 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
python生成任意频率正弦波方式
Feb 25 Python
Python读取二进制文件代码方法解析
Jun 22 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 Python
详解matplotlib绘图样式(style)初探
Feb 03 Python
用Python简陋模拟n阶魔方
Apr 17 Python
python 基于PYMYSQL使用MYSQL数据库
Dec 24 #Python
python xlsxwriter模块的使用
Dec 24 #Python
想学画画?python满足你!
Dec 24 #Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 #Python
用python获取txt文件中关键字的数量
Dec 24 #Python
举例讲解Python装饰器
Dec 24 #Python
python 基于opencv操作摄像头
Dec 24 #Python
You might like
smtp邮件发送一例
2006/10/09 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
2018/11/30 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
jquery获取多个checkbox的值异步提交给php
2015/07/07 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
js实现筛选功能
2020/11/24 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
Python解惑之整数比较详解
2017/04/24 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
学习python需要有编程基础吗
2020/06/02 Python
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
Hotels.com南非:酒店预订
2017/11/02 全球购物
创建文明学校实施方案
2014/03/11 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
村干部任职承诺书
2015/01/21 职场文书
2015年上半年计生工作总结
2015/03/30 职场文书
边城读书笔记
2015/06/29 职场文书
2015年车间管理工作总结
2015/07/23 职场文书