zoukankan      html  css  js  c++  java
  • 在pypi上发布python包详细教程

    使用Python编程中Python的包安装非常方便,一般都是可以pip来安装搞定:pip install <package name>,我们自己写的python也可以发布在pypi上,很简单。

    一、准备工作
    1.准备好你要发布的代码(简单的一个函数、一个类或者是一个你自己写的功能模块代码),测试代码以及目录结构

    二、在pypi上发布python包步骤如下:

    1. 注册账号:到pypi(https://pypi.org/)上注册自己的用户, 点击“Register”,填写自己的用户名,密码,邮箱。

    如果期望测试发布,同时需要注册pypitest账号(可以采用相同的用户名和密码)。
    pypitest官网:https://test.pypi.org/

    记下自己的用户名、密码,后面上传包的时候需要用到。
    也可以创建用户验证文件:vi ~/.pypirc

    [distutils]
    index-servers =
    pypi

    [pypi]
    repository: https://upload.pypi.org/legacy/
    username: 用户名
    password: 密码

    或者

    [distutils]
    index-servers =
    pypi
    pypitest

    [pypi]
    repository: https://upload.pypi.org/legacy/
    username: 用户名
    password: 密码

    [pypitest]
    repository: https://test.pypi.org/legacy/
    username: 用户名
    password: 密码

    2.安装必要的库

    打包工作主要依赖python的setuptools的包来完成,可以使用pip安装它:
    pip install setuptools

    原则上安装了pip的环境都有setuptools,但并不影响你去尝试升级一下它。
    pip install --upgrade setuptools

    twine
    这是一个简化将库发布到Pypi上流程的工具,具体的使用之后会讲到。
    pip install twine

    3.准备setup.py/setup.conf文件,它是放在你包的根目录的,这一步至关重要,包括要发布的包名字,版本,license,描述,特性(classifier)等等。

    下面是setup.py文件的示例内容,基本上只需要在这个上面修改就行了,具体如下:

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

    from setuptools import find_packages, setup

    setup(
    name='<项目的名称>',
    version='<项目的版本>',
    description='<项目的简单描述>',
    long_description=open('README.rst').read(),
    author='<项目的作者>',
    author_email='<作者邮箱>',
    maintainer='<维护人员的名字>',
    maintainer_email='<维护人员的邮箱>',
    packages=find_packages(),
    platforms=["all"],
    url='<项目的网址,可以使用自己github的url>',
    license='BSD License',
    classifiers=[
    'Development Status :: 4 - Beta',
    'Operating System :: OS Independent',
    'Intended Audience :: Developers',
    'License :: OSI Approved :: BSD License',
    'Programming Language :: Python',
    'Programming Language :: Python :: 2.7',
    'Programming Language :: Python :: Implementation :: CPython',
    'Programming Language :: Python :: Implementation :: PyPy'
    ],
    )

    简单字段说明:
    version:这个简单,就是包的发布的版本,可以直接写在这,也可以从其他地方引用过来。
    long_description:必须是rst(reStructuredText )格式的,因为这个里面的内容是显示在pypi包首页上,我的long_description是同目录下的README.rst的内容,同时这个README也是我的github项目首页。
    packages:申明你的包里面要包含的目录,比如 ['mypackage', 'mypackage_test'] 可以是这种使用我的示例,让setuptools自动决定要包含哪些包
    install_requires:申明依赖包,安装包时pip会自动安装:格式如下(我上面的setup.py没有这个参数,因为我不依赖第三方包:)):

    也可以克隆已有仓库(推荐)
    大名鼎鼎的requests库的作者大神kennethreitz为大家准备了一个仓库作为一个setup.py的很好的模板,当然你也可以自己手写setup.py。
    git clone https://github.com/kennethreitz/setup.py

    4.如果有依赖包可以使用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

    有了它们,结合tox等工具,可以非常方便的加入自动化测试。 
    准备这个两个文件不是必须的。但是,有了它们,用户可以自己手动安装依赖包。

    安装依赖包
    pip install -r requirements.txt

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

    最终的代码结构

    │ LICENSE
    │ MANIFEST.in
    │ README.rst
    │ setup.py

    └─condition_chain
    core.py
    __init__.py
    __version__.py


    6.编写核心代码

    接下来我们就可以编写自己的代码了,要注意源代码文件夹(仓库里的my_package文件夹)的名字与setup.py里配置的包名(Name)要一致。
    另外在重新上传之前我们要修改__version__.py里的版本号,以免覆盖了以前的上传(相信会有人是需要之前版本的库的)。

    7.打包上传

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

    可以使用下面命令打包一个源代码的包:
    # 在当前目录的dist文件夹下,会生成一个以tar.gz结尾的包了。
    python setup.py sdist build


    也可以打包一个wheels格式的包,使用下面的命令搞定:
    # 在dist文件夹下生成一个whl文件。
    python setup.py bdist_wheel --universal

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

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

    使用twine上传,先安装twine
    pip install twine
    上传
    twine upload dist/*
    会提示你前面注册的用户名和密码。一切搞定,你的包现在可以通过pip在任何地方安装了。

    报错解决:
    1.HTTPError: 403 Client Error: The user 'xxx' isn't allowed to upload to project '<项目的名称>'. See https://pypi.org/help/#project-name for more information. for url: https://upload.pypi.org/legacy/

    出现这个报错一般是python包名冲突,换个包名就可以了

    2.HTTPError: 403 Client Error: Invalid or non-existent authentication information. for url: https://upload.pypi.org/legacy/

    出现这个报错一般是用户名和密码错误了,要去网站上验证一下你前面注册的用户名和密码。

    Ps:
    1.pip的安装官方教程:https://pip.pypa.io/en/stable/installing/
    2.rst的语法可以参考:http://rest-sphinx-memo.readthedocs.io/en/latest/ReST.html
    3.对于一个包,需要长久维护,自动测试建议加入,可以使用tox和与第三方CI的集成。

  • 相关阅读:
    Haskell Interactive Development in Emacs
    Access Java API in Groovy Script
    手工设置Eclipse文本编辑器的配色
    Color Theme of Emacs
    Gnucash的投资记录
    Special Forms and Syntax Sugars in Clojure
    Use w3m as Web Browser
    SSE指令集加速之 I420转BGR24
    【图像处理】 增加程序速度的方法
    TBB 入门笔记
  • 原文地址:https://www.cnblogs.com/zqifa/p/pypi-1.html
Copyright © 2011-2022 走看看