前言

  突然想玩玩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. 使用hibernate连接Oracle时的权限问题

    在使用hibernate对象关系映射连接和创建表的时候,会涉及到很多权限问题,有些数据库管理会将权限设的很细,我们可以根据后台日志错误和异常信息作出判断. 比如下图所示这个错误(这是我在给银行投产系统 ...

  2. deeplearning.ai课程学习(1)

    本系列主要是我对吴恩达的deeplearning.ai课程的理解和记录,完整的课程笔记已经有很多了,因此只记录我认为重要的东西和自己的一些理解. 第一门课 神经网络和深度学习(Neural Netwo ...

  3. 修改freemarker的ftl时,不重启tomcat的办法(使用了springMVC)

    一.在使用Freemarker 时,需要在spring-mvc.xml 配置文件中作如下配置: <!-- 配置freeMarker的模板路径 --> <bean id="f ...

  4. 给Python初学者的一些编程建议

    Python是一种非常富有表现力的语言.它为我们提供了一个庞大的标准库和许多内置模块,帮助我们快速完成工作.然而,许多人可能会迷失在它提供的功能中,不能充分利用标准库,过度重视单行脚本,以及误解Pyt ...

  5. CSS设计指南之伪类

    伪类这个叫法源自它们与类相似,但实际上并没有类会附加到标记中的标签上.伪类分两种. UI伪类会在HTML元素处于某个状态时(比如鼠标指针位于链接上),为该元素应用CSS样式. 结构化伪类会在标记中存在 ...

  6. Aspose.Pdf合并PDF文件

    使用Aspose.Pdf类库,有很多种方法可以合并PDF文件,这里简单介绍小生见到的几种: Doucment.Pages.Add PdfFileEditor.Append PdfFileEditor. ...

  7. TCP的挥手协议和握手协议2

    三次握手协议:三次握手协议的主要过程是交互彼此之间的初始序列号,如果没有确认的ACK帧可以么?肯定是可以的 client A -------> server B client A 发送了自己的初 ...

  8. 玩lua

    https://my.oschina.net/wangxuanyihaha/blog/186401

  9. log4j的常用使用方法

    第一步,引入jar包,不做介绍. 第二步,创建以下类(固定写法) package smn.util; import org.apache.log4j.Logger; public class MyLo ...

  10. 在.net2.0下使用System.Web.Script.Serialization;

    最近,在弄json字符串转为对象.需要添加这个引用System.Web.Script.Serialization;因为版本必须是dotnet2.0的原因,发现很多解决方案不适合自己.故使用这种解决办法 ...