How to submit a package to PyPI
How to submit a package to PyPI
The other month a coworker of mine wanted to distribute a small wrapper he'd written for the Locu API. Instead of forcing developers to clone his repository, he wanted them to be able install with a single command: pip install locu. He wasn't sure how to go about this so I wrote up a quick guide, which I'm publishing below because I haven't found any other guides for this particular use case (python library hosted on github).
What is PyPI?
From the official website:
PyPI — the Python Package Index
The Python Package Index is a repository of software for the Python programming language.
Written something cool? Want others to be able to install it with easy_install or pip? Put your code on PyPI. It's a big list of python packages that you absolutely must submit your package to for it to be easily one-line installable.
The good news is that submitting to PyPI is simple in theory: just sign up and upload your code, all for free. The bad news is that in practice it's a little bit more complicated than that. The other good news is that I've written this guide, and that if you're stuck, you can always refer to the official documentation.
I've written this guide with the following assumptions:
- The module/library/package that you're submitting is called
mypackage. mypackageis hosted on github.
Create your accounts
On PyPI Live and also on PyPI Test. You must create an account in order to be able to upload your code. I recommend using the same email/password for both accounts, just to make your life easier when it comes time to push.
Create a .pypirc configuration file
This file holds your information for authenticating with PyPI, both the live and the test versions.
[distutils]
index-servers =
pypi
pypitest [pypi]
repository=https://pypi.python.org/pypi
username=your_username
password=your_password [pypitest]
repository=https://testpypi.python.org/pypi
username=your_username
password=your_password
This is just to make your life easier, so that when it comes time to upload you don't have to type/remember your username and password. Make sure to put this file in your home folder – its path should be ~/.pypirc.
Notes on passwords / usernames
Michiel Sikma has reported that in Python 3 if your password includes a raw %, it needs to be escaped by doubling – the .pypirc config parser interpolates strings. For example, if your password is hello%world:
[pypi]
repository=https://pypi.python.org/pypi
username=myusername
password=hello%%world
I've never run into this issue, but if you're having trouble this might help.
Andrew Farrell points out that if your password includes spaces, make sure not to quote it. For example, if your password is correct horse battery staple:
[pypi]
repository=https://pypi.python.org/pypi
username=myusername
password=correct horse battery staple
Thanks to Michiel, Andrew, and Charlie Hack for their help with this section.
Prepare your package
Every package on PyPI needs to have a file called setup.py at the root of the directory. If your'e using a markdown-formatted read me file you'll also need a setup.cfg file. Also, you'll want a LICENSE.txt file describing what can be done with your code. So if I've been working on a library called mypackage, my directory structure would look like this:
root-dir/ # arbitrary working directory name
setup.py
setup.cfg
LICENSE.txt
README.md
mypackage/
__init__.py
foo.py
bar.py
baz.py
Here's a breakdown of what goes in which file:
setup.py
This is metadata about your library.
from distutils.core import setup
setup(
name = 'mypackage',
packages = ['mypackage'], # this must be the same as the name above
version = '0.1',
description = 'A random test lib',
author = 'Peter Downs',
author_email = 'peterldowns@gmail.com',
url = 'https://github.com/peterldowns/mypackage', # use the URL to the github repo
download_url = 'https://github.com/peterldowns/mypackage/tarball/0.1', # I'll explain this in a second
keywords = ['testing', 'logging', 'example'], # arbitrary keywords
classifiers = [],
)
The download_url is a link to a hosted file with your repository's code. Github will host this for you, but only if you create a git tag. In your repository, type: git tag 0.1 -m "Adds a tag so that we can put this on PyPI.". Then, type git tag to show a list of tags — you should see 0.1 in the list. Type git push --tags origin master to update your code on Github with the latest tag information. Github creates tarballs for download athttps://github.com/{username}/{module_name}/tarball/{tag}.
setup.cfg
This tells PyPI where your README file is.
[metadata]
description-file = README.md
This is necessary if you're using a markdown readme file. At upload time, you may still get some errors about the lack of a readme — don't worry about it. If you don't have to use a markdown README file, I would recommend usingreStructuredText (REST) instead.
LICENSE.txt
This file will contain whichver license you want your code to have. I tend to use the MIT license.
Upload your package to PyPI Test
Run:
python setup.py register -r pypitest
This will attempt to register your package against PyPI's test server, just to make sure you've set up everything correctly.
Then, run:
python setup.py sdist upload -r pypitest
You should get no errors, and should also now be able to see your library in the test PyPI repository.
Upload to PyPI Live
Once you've successfully uploaded to PyPI Test, perform the same steps but point to the live PyPI server instead. To register, run:
python setup.py register -r pypi
Then, run:
python setup.py sdist upload -r pypi
and you're done! Congratulations on successfully publishing your first package!
How to submit a package to PyPI的更多相关文章
- 如何上传package到pypi
首先访问 pypi 创建一个帐号,并且需要验证一个邮箱,注意网易163邮箱收不到验证的邮件. 安装上传工具 pip install --user twine 执行上传命令 python setup.p ...
- How to using PyPI publish a Python package
How to using PyPI publish a Python package PyPI & Python package https://pypi.org/ main make a f ...
- 使用pypi-server搭建简单的PyPI源
pypiserver 是一个最基本的PyPI服务器实现, 可以用来上传和维护python包. 本文介绍 pypiserver 在ubuntu上的基本安装, 配置和使用. 1. 基本安装和使用 1.1 ...
- Creating a NuGet Package in 7 easy steps - Plus using NuGet to integrate ASP.NET MVC 3 into existing Web Forms applications
UPDATE: Check out my follow up post where I remove the need for editing the Global.asax.cs and show ...
- 如何将Python项目发布到PyPI
The Python Package Index (PyPI) is a repository of software for the Python programming language. 如何打 ...
- python urllib模块
1.urllib.urlopen(url[,data[,proxies]]) urllib.urlopen(url[, data[, proxies]]) :创建一个表示远程url的类文件对象,然后像 ...
- python中对 函数 闭包 的理解
最近学到 函数 闭包的时候,似懂非懂.迷迷糊糊的样子,很是头疼,今天就特意查了下关于闭包的知识,现将我自己的理解分享如下! 一.python 闭包定义 首先,关于闭包,百度百科是这样解释的: 闭包是指 ...
- 系统学习爬虫_2_urllib
什么是urllib urlopen urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cad ...
- “全能”选手—Django 1.10文档中文版Part4
第一部分传送门 第二部分传送门 第三部分传送门 3.2 模型和数据库Models and databases 3.2.2 查询操作making queries 3.3.8 会话sessions 2.1 ...
随机推荐
- Docker实战(四)之Docker数据管理
在生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及到容器的数据管理操作. 容器中管理数据主要有两种形式: 数据卷:容器内数据直接映射到本地主 ...
- 在不升级 mysql 的情况下直接使用 mysql utf8 存储 超过三个字节的 emoji 表情
由于现在数据库的版本是5.5.2,但是看网上说要直接存储emoji表情,需要升级到5.5.3然后把字符集设置为utf8mb4,但是升级数据库感觉属于敏感操作. 考虑了多久之后直接考虑使用正则来替换,但 ...
- C++重载运算符练习--对people类重载“= =”运算符和“=”运算符
题目描述 对people类重载“= =”运算符和“=”运算符,“==”运算符判断两个people类对象的id属性是否相等:“=”运算符实现people类对象的赋值操作. 代码如下 #include&l ...
- 如何防止网页被植入广告,内容被监控-HTTPS
前几天一朋友说访问网站页面底部怎么出现小广告了呢,内容有点不雅,朋友截图发给我,调侃我说怎么放这种广告,我一听纳闷,网站运行伊始,从来没有投放过任何广告,更别说不雅广告了. 最近还遇到一个问题就是,网 ...
- 生死系列--fuding
fuding是我们村上的人,比我大十几岁的样子,长的浓眉大眼,相貌很不错,说话声音深厚.当兵转业后留在武汉,取了老婆听说是本地大官的女儿,他们又生了一个女儿,一家经济实力不错. 我们互相见面一般是在春 ...
- 大数据入门第十一天——hive详解(三)hive函数
一.hive函数 1.内置运算符与内置函数 函数分类: 查看函数信息: DESC FUNCTION concat; 常用的分析函数之rank() row_number(),参考:https://www ...
- # 20155229 2016-2017-2 《Java程序设计》第七周学习总结
20155229 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 第十二章 lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装 ...
- 20145207 Exp9 web安全基础实践
Exp9 web安全基础实践 实验后回答问题 (1)SQL注入攻击原理,如何防御 攻击原理:修改信息 防御:禁止输入 (2)XSS攻击的原理,如何防御 攻击原理:看别人的博客,感觉就是强制访问. 防御 ...
- https确实加密了。 抓包是一个中间人攻击过程
https加密了为什么抓包还是明文 有客户已经正确部署了SSL证书,但是向我们提出了这个问题:我今天采用抓包工具进行抓包,但是我发现数据没有加密,请问是怎么回事?那采用证书加密有什么用?是不是很轻易的 ...
- Noip前的大抱佛脚----奇技淫巧
STL函数 set set查找前驱后继 multiset<int>::iterator iter; S.insert(x); iter=S.find(x);//返回迭代器 iter--;/ ...