python发布包到pypi的踩坑记录
前言
突然想玩玩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
基本流程:
[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的踩坑记录的更多相关文章
- Python发布包到Pypi
本地打包:python setup.py sdist 上传Pypi:python setup.py register sdist upload
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- QT踩坑记录1-多线程信号与槽
QT踩坑记录1-多线程信号与槽 QTC++Bugs 错误输出 无错误输出, 但是声明了信号的连接,但是无法使用 程序中就是无命令 介绍 QT 典型程序 #include <QObject> ...
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- google nmt 实验踩坑记录
最近因为要做一个title压缩的任务,所以调研了一些text summary的方法. text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...
- ABP框架踩坑记录
ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...
随机推荐
- jmeter☞文件目录(一)
Jmeter的文件目录如下图: 1.bin:可执行文件目录 a.jmeter.bat:Windows环境下的启动文件 b.jmeter.log:日志文件 c.jmeter.sh:Linux环境下的启动 ...
- 1034 Head of a Gang (30 分)(图的遍历or并查集)
dfs #include<bits/stdc++.h> using namespace std; ; int mp[N][N]; int weight[N]; int vis[N]; ma ...
- 论文翻译--StarCraft Micromanagement with Reinforcement Learning and Curriculum Transfer Learning
(缺少一些公式的图或者效果图,评论区有惊喜) (个人学习这篇论文时进行的翻译[谷歌翻译,你懂的],如有侵权等,请告知) StarCraft Micromanagement with Reinforce ...
- [leetcode-640-Solve the Equation]
Solve a given equation and return the value of x in the form of string "x=#value". The equ ...
- Linux C++线程池实例
想做一个多线程服务器测试程序,因此参考了github的一些实例,然后自己动手写了类似的代码来加深理解. 目前了解的线程池实现有2种思路: 第一种: 主进程创建一定数量的线程,并将其全部挂起,此时线程状 ...
- 利用java中的BigInteger实现进制转换
[原创] java中的进制BigInteger十分的强大,而且好用,他可以表示任意大的整数,同时还可以进行进制转换,十分的方便, 代码示例: package com.jiajia.demo_1; im ...
- 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api
TP5_Splider 一个基于Thinkphp5+phpQuery 网络爬虫抓取数据接口 统一输出接口数据api.适合正在学习Vue,AngularJs框架学习 开发demo,需要接口并保证接口不跨 ...
- java基础知识-冒泡排序
//冒泡排序,从数组前面向后循环比较 public static void sort1(int[] aa){ int size=aa.length; int temp; //循环数组 for(int ...
- Delphi 7学习开发控件(续)
继上次我们学习开发一个简单的画线控件后,基本的制作控件步骤已经清楚了,这次我们继续加深学习控件的制作.我们打开Delphi 7创建一个应用程序,拖动LineTo控件到窗体上,仔细看左边的对象设计器,可 ...
- BZOJ4472 JSOI2015salesman(树形dp)
相当于选一个包含根的连通块使权值和最大,且每个点的儿子选取数量有限制.那么显然贪心的在所有子树中选比较大的就可以了.至于方案是否唯一只需要看选的子树是否可以替换,注意dp值为0的情况. #includ ...