在Pypi上发布自己的Python包

使用Python编程的都知道,Python的包安装非常的方便,一般都是可以pip来安装搞定:

sudo pip install <package name>

pip的安装请移步:https://pip.pypa.io/en/stable/installing/



最近因为项目上的需要,发布了一个自己的pypi Python包,这里我大致分享如何发布自己的Pypi包一般过程。

打包工作主要依赖python的一个叫setuptools的包来完成,在进行下面操作前请使用pip安装它:

sudo pip install setuptools

(这里面我都是假设你已经准备好你的代码,测试代码以及目录结构,加上我今天要分享的,就可以组成一个完整的python包)

  • 1. 第一步,就是到pypi(https://pypi.python.org/pypi)上注册自己的用户, 点击“Register”,填写自己的用户名,密码,邮件地址后,就成功了。

记住自己的用户名和密码,后面上传的时候要输入的

  • 2. 准备setup.py/setup.conf文件,它是放在你包的根目录的,这一步至关重要,包括要发布的包名字,版本,license,描述,特性(classifier)等等,下面是我自己包的一个setup.py文件的内容,基本上只需要在这个上面修改就行了,具体如下:

#!/usr/bin/env python
# coding=utf-8

from setuptools import setup, find_packages

setup(
    name=‘persist-queue‘,
    version=__import__(‘persistqueue‘).__version__,
    description=(
        ‘A thread-safe disk based persistent queue in Python.‘
    ),
    long_description=open(‘README.rst‘).read(),
    author=‘Peter Wang‘,
    author_email=‘[email protected]‘,
    maintainer=‘Peter Wang‘,
    maintainer_email=‘[email protected]‘,
    license=‘BSD License‘,
    packages=find_packages(),
    platforms=["all"],
    url=‘http://github.com/peter-wangxu/persist-queue‘,
    classifiers=[
        ‘Development Status :: 4 - Beta‘,
        ‘Operating System :: OS Independent‘,
        ‘Intended Audience :: Developers‘,
        ‘License :: OSI Approved :: BSD License‘,
        ‘Programming Language :: Python‘,
        ‘Programming Language :: Python :: Implementation‘,
        ‘Programming Language :: Python :: 2‘,
        ‘Programming Language :: Python :: 2.7‘,
        ‘Programming Language :: Python :: 3‘,
        ‘Programming Language :: Python :: 3.4‘,
        ‘Programming Language :: Python :: 3.5‘,
        ‘Programming Language :: Python :: 3.6‘,
        ‘Topic :: Software Development :: Libraries‘
    ],
)

需要注意的上面的字段:

  • version - 这个简单,就是包的发布的版本,可以直接写在这,也可以从其他地方引用过来。
  • long_description - 必须是rst(reStructuredText )格式的,因为这个里面的内容是显示在pypi包首页上,具体rst的语法可以参考:http://rest-sphinx-memo.readthedocs.io/en/latest/ReST.html

   我的long_description是同目录下的README.rst的内容,同时这个README也是我的github项目首页。

  • packages - 申明你的包里面要包含的目录,比如  [‘mypackage‘, ‘mypackage_test‘]  可以是这种使用我的示例,让setuptools自动决定要包含哪些包
  • install_requires - 申明依赖包,安装包时pip会自动安装:格式如下(我上面的setup.py没有这个参数,因为我不依赖第三方包:)):
    install_requires=[
        ‘Twisted>=13.1.0‘,
        ‘w3lib>=1.17.0‘,
        ‘queuelib‘,
        ‘lxml‘,
        ‘pyOpenSSL‘,
        ‘cssselect>=0.9‘,
        ‘six>=1.5.2‘,
        ‘parsel>=1.1‘,
        ‘PyDispatcher>=2.0.5‘,
        ‘service_identity‘,
    ]

3. 准备requirements.txt 和 test-requirements.txt,这个申明包的依赖包和跑自动化测试的测试依赖包,具体格式示例如下:

mock>=2.0.0
flake8>=3.2.1
eventlet>=0.19.0
nose2>=0.6.5
cov_core>=1.15.0
virtualenv>=15.1.0

以上是我的test-requirements.txt的内容,requirements.txt的格式个上面一样。

准备这个两个文件不是必须的。

但是,有了它们,用户可以自己手动安装依赖包

pip install -r requirements.txt

有了它们,结合tox等工具,可以非常方便的加入自动化测试。 

  • 4. 准备一个项目的README.rst文件,前面也提到了它的格式要求,第一次发包,可以直接copy别人的格式,这东西熟能生巧,多写就会了。

下面是我的README的截图,就长这个样子:

  • 5. 准备好上面的步骤,一个包就基本完整了,剩下的就是打包了(cd到包的根目录):

可以使用下面命令打包一个源代码的包:

python setup.py sdist build

这样在当前目录的dist文件夹下,就会多出一个以tar.gz结尾的包了:

也可以打包一个wheels格式的包,使用下面的命令搞定:

python setup.py bdist_wheel --universal

这样会在dist文件夹下生成一个whl文件,

  • 6. 上传生成的包,可以使用setuptools,或者twine上传,推荐使用twine上次,因为使用setuptools上传时,你的用户名和密码是明文或者未加密传输,安全起见还是使用twine吧

# 上传source 包
python setup.py sdist upload
# 上传pre-compiled包
python setup.py bdist_wheel upload

使用twine上传,先安装twine

sudo pip install twine

twine upload dist/*

上次前都会提示你前面注册的用户名和密码。一切搞定,你的包现在可以通过pip在任何地方安装了。


后续

其实对于一个包,你要长久维护,自动测试肯定要加入,后面有时间再分享下如何使用tox的使用和与第三方CI的集成。

引用链接:

pypi详细教程: https://packaging.python.org/distributing

我的开源python包: https://github.com/peter-wangxu/persist-queue

时间: 2024-10-14 09:37:39

在Pypi上发布自己的Python包的相关文章

python的模块管理与发布+如何在pypi上发布自己的模块

1.安装模块 1.1,从源码安装 找到代码的url,一般在开源托管平台上有,再wget或git克隆下来,tar解压,如果有setup.py文件则运行此文件,如果没有按照INSTALL或README文档安装运行,从pypi中央仓库中下载源码的话一定有setup.py 1.2,模块管理工具来安装 pip,easy_install 用这个方法有个好处就是版本控制和依赖的处理.在这两种方法里面一般用pip,因为用pip更省事.与设置yum的本地源一样也可以通过设置pip的本地元为国内的源豆瓣镜像,具体方

如何在Pypi上发表自己的Python库

背景 最近兴趣使然写了几个Python库,也发布到了Pypi上,虽然没什么人下载,但自己在其他机器上用着也会很方便.这里我向大家介绍一下如何在Pypi上发表自己的Python库. 准备 注册账号 很显然地要在Pypi上注册一个账号. 安装必要的库 setuptools 原则上安装了pip的环境都有setuptools,但并不影响你去尝试升级一下它. pip install --upgrade setuptools twine 这是一个简化将库发布到Pypi上流程的工具,具体的使用之后会讲到. p

在npm上发布一个自己的包

1.首先你要在npm上创建一个账号,这里需要输入邮箱的,注意激活邮箱否则无法publish自己的包 2.在本地创建一个文件夹,输入npm init初始化项目,这里是我使用npm init创建的package.json文件 这是我的包的index.js代码,很简单就是一个hello world 3.创建好package.json以及我们自己的模块代码文件(index.js)之后需要添加用户 npm adduser 接下来会提示输入用户名,密码以及邮箱,这些都是你之前在注册账号的时候输入的,如果邮箱

使用 twine 上传自己的 python 包到 pypi

打包检查 python setup.py check 打包 python3 setup.py sdist build 上传 twine upload dist/* twine 安装: pip install twine twine 提示输入 pypi 账号和密码,上传成功否就能在自己的pypi账号中看到了. 但是并不是马上就能使用 pip 安装了.需要等待一段时间. 原文地址:https://www.cnblogs.com/leffss/p/12029963.html

Lravel5学习五:在packagist上发布自己的composer包

学习laravel5已经有一段的时间了,深深被composer管理php包的功能感动,想想自己也来动手写个包,发布到packagist上. 包功能介绍 此包实现功能:laravel5使用百度UEditor编辑器,同时支持上传文件到七牛及本地. 此项目原始作者项目地址:stevenyangecho/laravel-u-editor 我修改部分说明: 修改了对于项目不是部署于根目录时,上传图片回显路径不正确 将配置文件命名为:ueditor.php,并在其中新增变量baseurl,以及对部分变量的说

纯Python包发布setup脚本编写示例

如果你有多个模块需要发布,而它们又存在于多个包中,那么指定整个包比指定模块可能要容易地多.即使你的模块并不在一个包内,这种做法也行的通:你可以告诉Distutils从根包(root package)处理模块,并且它工作起来和其他任意的包一样(除非你不需要拥有一个__init__.py文件). 例1.1 根包发布 文件结构为: <root>/ setup.py foo.py bar.py setup脚本可以这样写: from distutils.core import setup setup(n

pip安装python包出现Cannot fetch index base URL http://pypi.python.org/simple/

pipinstall***安装python包,出现 Cannot fetch index base URL  http://pypi.python.org/simple /错误提示或者直接安装不成功. 解决办法1.windows下创建/%user%/pip/pop.ini,并添加以下内容.        [global]          index-url=http://pypi.douban.com/simple/ 2.linux创建文件~/.pip/pip.conf,并添加一下内容.   

[转载]Python 包管理工具解惑

原文链接:http://zengrong.net/post/2169.htm Python 包管理工具解惑 python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到相当疑惑(嗯,是困惑).主要表现在下面几个方面: 这几个包管理工具有什么不同? distutils setuptools distribute disutils2 distlib pip 什么时候该用pip,什么时候该用 setup.py ,它们有关系么? easy_install.ez_setup

Python 包管理工具解惑

Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到相当疑惑(嗯,是困惑).主要表现在下面几个方面: 这几个包管理工具有什么不同? distutils setuptools distribute disutils2 distlib pip 什么时候该用pip,什么时候该用 setup.py ,它们有关系么? easy_install.ez_setup