前言

  突然想玩玩python了^_^ 这篇博文记录了我打算发布包到pypi的踩坑经历.python更新太快了,甚至连这种发布上传机制都在不断的更新,这导致网上的一些关于python发布上传到pypi的教程都过时了,按着博文操作会失败,所以请记住,我这篇博文的介绍也许在你看到时也过时了^_^

pypi相关概念介绍

关于pypi本身

  pypi是专门用于存放第三方python包的地方,你可以在这里找别人分享的模块,也可以自己分享模块给别人。可以通过easy_install或者pip进行安装。pypi针对分享提供了两个平台,一个是测试发布平台,一个是正式发布平台,我们正式发布前可以先用测试发布平台发布,看是否正确,然后再采用正式发布平台.

关于python打包发布工具

  python的打包安装工具也经历了很多次变化,由最早的distutils到setuptools到distribute又回到setuptools,后来还有disutils2以及distlib等,其中distutils是python标准库的一部分,它提出了采用setup.py机制安装和打包发布上传机制.setuptools(操作系统发布版本可能没有自带安装,需要自己额外安装)基于它扩展了很多功能,也是采用setup.py机制,针对安装额外提供了easy_install命令.distribute是setuptools的一个分之,后来又合并到setuptools了,所以姑且就把它看做是最新的setuptools吧!和我们打包最相关的貌似就是distutils或者setuptools,两者都可以用来打包发布并上传到pypi,后面介绍采用distutils,如果想更多的功能,比如想通过entry points扩展的一些功能,那么就要使用setuptools了.另外,还有一个工具可以用来发布到pypi,叫twine,需要额外安装.最后,需要确保自己的工具都是尽量新的,官方给出的版本参考:twine v1.8.0+ (recommended tool), setuptools 27+, or the distutils included with Python 3.4.6+,Python 3.5.3+, Python 3.6+, and 2.7.13+,升级的参考命令sudo -H pip install -U pip setuptools twine

打包发布到pypi

基本流程:

  • 注册pypi账号,如果期望测试发布,同时需要注册pypitest账号(可以采用相同的用户名和密码)

  • 创建配置文件, 该配置文件里面记录了你的账号信息以及要发布的平台信息,参考如下配置文件创建即可

[distutils]
index-servers =
pypi
pypitest [pypi]
repository: https://upload.pypi.org/legacy/
username: your_username
password: your_password [pypitest]
repository: https://test.pypi.org/legacy/
username: your_username
password: your_password

该配置文件可以保存到~/.pypirc中,以后基本就不需要修改了。注意,这一步的配置文件编写由于pypi的发布机制更新导致有一些坑的出现,后面会讲述

  • 配置工程,这一步会因为工程的复杂度而有较大不同,主要是工程配置文件setup.py,这里用个简单的工程进行讲述.创建工程文件夹,并创建helloxxxxx.py模块(里面的内容随意,创建一个打印hello的函数也行)以及setup.py文件,setup.py参考如下配置文件创建即可
from distutils.core import setup

setup(
name = "helloxxxxx",
author = "name",
version = "1.0.0",
author_email = "xxx@gmail.com",
py_modules = ['helloxxxxx'],
url = "http://www.xxx.com"
)

注意,这里只是最基本的参考例子,执行打包会报警告,说缺少一些需要的文件,比如MANIFEST.in、readme.txt等等,暂时忽略即可。正式的项目中会复杂很多,甚至需要用到setuptools来扩展。这部分可以参考其他文档

  • 为了保证效果,在打包之前我们可以验证setup.py的正确性。执行代码python3 setup.py check,输出一般是running check,如果有错误或者警告,就会在此之后显示.没有任何显示表示Distutils认可你这个setup.py文件

  • 执行python3 setup.py sdist upload -r pypi创建发布并上传,如果想先上传到测试平台,可以执行python setup.py sdist upload -r pypitest,成功后再执行上面命令上传到正式平台。注意,这一步的配置文件里面由于pypi的发布机制更新导致有一些坑的出现,后面会讲述

踩坑记录

之所以有这些坑, 是因为python更新太快以及自己没有认真看最新官方文档导致的!

坑1

410错误,这个是pypi上传机制变更导致的,我虽然参考的是最新的blog,但是还是过时了!!!

首先,.pypirc的repository过时了,很多博客说的repository: https://pypi.python.org/pypi会导致后面步骤操作出现410错误

其次,很多博客说的两步走方案

python3 setup.py register -r pypi
python3 setup.py sdist upload -r pypi

也过时了,现在不需要第一步了

坑2

400错误,setup.py配置文件里面某些字段我写的太随意,导致上传的时候出错,比如url那里我没有加http://,这里也需要大家注意

坑3

403错误,这是因为项目和已有的项目重名了,可以先到https://pypi.python.org/simple/上搜一下看看是否重名。解决的方法自然就是修改一下setup.py中setup函数中的name参数,删除之前生成的dist文件夹并重新生成,然后再upload

参考

完!

2017年8月

python发布包到pypi的踩坑记录的更多相关文章

  1. Python发布包到Pypi

    本地打包:python setup.py sdist 上传Pypi:python setup.py register sdist upload

  2. CentOS7.4安装MySQL踩坑记录

    CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...

  3. QT踩坑记录1-多线程信号与槽

    QT踩坑记录1-多线程信号与槽 QTC++Bugs 错误输出 无错误输出, 但是声明了信号的连接,但是无法使用 程序中就是无命令 介绍 QT 典型程序 #include <QObject> ...

  4. unionId突然不能获取的踩坑记录

    昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...

  5. ubuntu 下安装docker 踩坑记录

    ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...

  6. SpringBoot + Shiro + shiro.ini 的踩坑记录

    0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...

  7. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  8. google nmt 实验踩坑记录

       最近因为要做一个title压缩的任务,所以调研了一些text summary的方法.    text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...

  9. ABP框架踩坑记录

    ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...

随机推荐

  1. Laxcus大数据管理系统2.0(4)- 第一章 基础概述 1.3 节点

    1.3 节点 按照我们给Laxcus集群的设计定义,Laxcus集群被分为内部和外部两个网络环境.内部网络由集群的所有权人负责实施和管理,为保证集群能够有效可靠运行,需要遵守一系列的集群部署和管理规定 ...

  2. Gym101981I Magic Potion(最大流)

    Problem I. Magic Potion There are n heroes and m monsters living in an island. The monsters became v ...

  3. 常量表达式 & constexpr

    [常量表达式] 一个这样的表达式:值不会改变 && 在编译过程中就能够得到计算结果 常见的常量表达式:字面值.用常量表达式初始化的const对象 一个对象是不是常量表达式由它的数据类型 ...

  4. 预处理器&预处理变量&头文件保护&条件编译

    [常见的预处理功能] #include 头文件保护符 条件编译 [预处理器] 编译之前执行的一段程序,可以部分地改变我们所写的程序 举个例子:当预处理器看到#include标记时就会用指定的头文件的内 ...

  5. 第18讲——string类

    关键字:string类  字符串  C-风格字符串  C库字符串函数 字符串:存储在内存的连续字节中的一系列字符. C++处理字符串的方式有两种: 来自C语言,常被称为C-风格字符串: 基于strin ...

  6. [android]不解锁刷机

    本人因为误操作进入andriod recovery模式,显示failed to boot 2,致手机无法恢复出厂值, 当时那叫一个郁闷.上论坛搜寻无数,唉让刷底包的无数(在此不解释),万恶的刷底包. ...

  7. mysql原理以及相关优化

    说起MySQL的查询优化,相信大家积累一堆技巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在 ...

  8. 搭建Hadoop环境(二)

    摘要:近来又用到了Linux系统,所以就又新装了一个虚拟机和CentOS 6.4来用,搞开发的程序猿们可能都知道,在现在的很多企业中,生产环境大多都是Linux服务器,并且用的比较多的大都是CentO ...

  9. js把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式

    最近在做项目的时候,需要把后台返回的时间转换成几秒前.几分钟前.几小时前.几天前等的格式:后台返回的时间格式为:2015-07-30 09:36:10,需要根据当前的时间与返回的时间进行对比,最后显示 ...

  10. 【题解】NOI2009管道取珠

    又是艰难想题的一晚,又是做不出来的一题 (:д:) 好想哭啊…… 这题最关键的一点还是提供一种全新的想法.看到平方和这种东西,真的不好dp.然而我一直陷在化式子的泥潭中出不来.平方能够联想到什么?原本 ...