如何将自己的Python代码打包发布到pypi上

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将自己的Python代码打包发布到pypi上相关的知识,希望对你有一定的参考价值。

    什么是pypi

    简单的说pypi是一个python包的仓库,里面有很多别人写好的python库,你可以通过easy_install或者pip进行安装,方便用户更方面的使用你的代码模块。

    将代码打包并上传到pypi上,大体上分为以下几步:

    1、整理代码的目录结构,方便打包和python的import,为了方便引用,需要将代码模块变成一个包,所以需要将功能代码用目录来整合方便引用,并且需要创建__init__文件,__init__中可以没有内容,也可以在__init__文件中进行import(from .extractor import Document)操作,以减少整体模块引用时import的层数,避免错误。

[html] view plain copy
├── ./tidypage  
│   ├── ./tidypage/cleaners.py  
│   ├── ./tidypage/extractor.py  
│   ├── ./tidypage/__init__.py  
│   └── ./tidypage/titles.py

    2、功能模块的目录整理好后,就可以开始整理和添加发布到pypi上所使用的文件了

tidy_page  
├── LICENSE  
├── README.rst  
├── requirements.txt  
├── setup.py  
├──tidypage  
│   ├──cleaners.py  
│   ├──extractor.py  
│   ├──__init__.py  
│   └──titles.py

    就是将原来的目录深移一层,文件夹名称可以根据自己意愿。然后在到第一层的目录下创建些特殊文件,具体你可以看看下面这个文件结构你就明白了

    LICENSE文件是授权文件,比如:MIT license, APACHE license

    README.rst 文件想必大家都不陌生,其实就是项目介绍和使用说明

    setup文件才是重点,是python模块安装所需要的文件,它的格式如下:

#!/usr/bin/env python  
from __future__ import print_function  
from setuptools import setup, find_packages  
import sys  
  
setup(  
    name="tidy-page",  
    version="0.1.1",  
    author="Desion Wang",  
    author_email="wdxin1322@qq.com",  
    description="html text parser,get the content form html page",  
    long_description=open("README.rst").read(),  
    license="MIT",  
    url="https://github.com/desion/tidy_page",  
    packages=['tidypage'],  
    install_requires=[  
        "beautifulsoup4",  
        lxml_requirement  
        ],  
    classifiers=[  
        "Environment :: Web Environment",  
        "Intended Audience :: Developers",  
        "Operating System :: OS Independent",  
        "Topic :: Text Processing :: Indexing",  
        "Topic :: Utilities",  
        "Topic :: Internet",  
        "Topic :: Software Development :: Libraries :: Python Modules",  
        "Programming Language :: Python",  
        "Programming Language :: Python :: 2",  
        "Programming Language :: Python :: 2.6",  
        "Programming Language :: Python :: 2.7",  
    ],  
)

    NAME 名字,一般放你包的名字即可PACKAGES 包含的包,可以多个,这是一个列表DESCRIPTION 关于这个包的描述LONG_DESCRIPTION 参见read方法说明KEYWORDS 关于当前包的一些关键字,方便PyPI进行分类。AUTHOR 谁是这个包的作者,写谁的名字吧AUTHOR_EMAIL 作者的邮件地址URL 你这个包的项目地址,如果有,给一个吧,没有你直接填写在PyPI你这个包的地址也是可以的VERSION 当前包的版本,这个按你自己需要的版本控制方式来LICENSE 授权方式INSTALL_REQUIRES 模块所依赖的python模块

    文中的classifiers的内容并不是随便填写的,你需要参照本文参考文档中的PyPI Classifiers来写

    3、开始使用Distutils进行打包

    为了保证效果,在打包之前我们可以验证setup.py的正确性,执行下面的代码

    python setup.py check

    输出一般是running check如果有错误或者警告,就会在此之后显示没有任何显示表示Distutils认可你这个setup.py文件。


    如果没有问题,那么就可以正式打包,执行下面的代码:


    python setup.py sdist



    执行完成后,会在顶层目录下生成dist目录和egg目录

tidy_page  
├── tidy_page/dist  
│   ├── tidy_page/dist/tidy-page-0.1.0.tar.gz  
│   └── tidy_page/dist/tidy-page-0.1.1.tar.gz  
├── tidy_page/LICENSE  
├── tidy_page/README.rst  
├── tidy_page/setup.py  
├── tidy_page/tidypage  
│   ├── tidy_page/tidypage/cleaners.py  
│   ├── tidy_page/tidypage/extractor.py  
│   ├── tidy_page/tidypage/__init__.py  
│   └── tidy_page/tidypage/titles.py  
├── tidy_page/tidy_page.egg-info  
│   ├── tidy_page/tidy_page.egg-info/dependency_links.txt  
│   ├── tidy_page/tidy_page.egg-info/PKG-INFO  
│   ├── tidy_page/tidy_page.egg-info/requires.txt  
│   ├── tidy_page/tidy_page.egg-info/SOURCES.txt  
│   └── tidy_page/tidy_page.egg-info/top_level.txt


    4、打包完成后就可以准备将打包好的模块上传到pypi了,首先你需要在pypi上进行注册 goto PyPI Live 

    注册完成后,你需要在本地创建好pypi的配置文件,不然有可能会出现使用http无法上传到pypi的问题

    Create a .pypirc configuration file,在用户的home目录下创建.pypirc文件,文件的内容如下

    [distutils]index-servers =  pypi[pypi]repository=https://pypi.python.org/pypiusername=your_usernamepassword=your_passwor

chmod 600 ~/.pypirc
python setup.py register -r pypi

    在pypi上注册模块

    python setup.py sdist upload -r pypi

    上传python文件包,没有问题你就可以在pypi上看到你上传的包了并且可以使用pip搜索和install你的python包了


参考技术A 什么是pypi
简单的说pypi是一个python包的仓库,里面有很多别人写好的python库,你可以通过easy_install或者pip进行安装,方便用户更方面的使用你的代码模块。

将代码打包并上传到pypi上,大体上分为以下几步:

1、整理代码的目录结构,方便打包和python的import,为了方便引用,需要将代码模块变成一个包,所以需要将功能代码用目录来整合方便引用,并且需要创建__init__文件,__init__中可以没有内容,也可以在__init__文件中进行import(from .extractor import Document)操作,以减少整体模块引用时import的层数,避免错误。

[html] view plain copy
├── ./tidypage
│ ├── ./tidypage/cleaners.py
│ ├── ./tidypage/extractor.py
│ ├── ./tidypage/__init__.py
│ └── ./tidypage/titles.py
2、功能模块的目录整理好后,就可以开始整理和添加发布到pypi上所使用的文件了
[html] view plain copy
tidy_page
├── LICENSE
├── README.rst
├── requirements.txt
├── setup.py
├──tidypage
│ ├──cleaners.py
│ ├──extractor.py
│ ├──__init__.py
│ └──titles.py
就是将原来的目录深移一层,文件夹名称可以根据自己意愿。然后在到第一层的目录下创建些特殊文件,具体你可以看看下面这个文件结构你就明白了

LICENSE文件是授权文件,比如:MIT license, APACHE license

README.rst 文件想必大家都不陌生,其实就是项目介绍和使用说明

setup文件才是重点,是python模块安装所需要的文件,它的格式如下:

[python] view plain copy
#!/usr/bin/env python
from __future__ import print_function
from setuptools import setup, find_packages
import sys

setup(
name="tidy-page",
version="0.1.1",
author="Desion Wang",
author_email="wdxin1322@qq.com",
description="html text parser,get the content form html page",
long_description=open("README.rst").read(),
license="MIT",
url="https://github.com/desion/tidy_page",
packages=['tidypage'],
install_requires=[
"beautifulsoup4",
lxml_requirement
],
classifiers=[
"Environment :: Web Environment",
"Intended Audience :: Developers",
"Operating System :: OS Independent",
"Topic :: Text Processing :: Indexing",
"Topic :: Utilities",
"Topic :: Internet",
"Topic :: Software Development :: Libraries :: Python Modules",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
],
)

NAME 名字,一般放你包的名字即可
PACKAGES 包含的包,可以多个,这是一个列表
DESCRIPTION 关于这个包的描述
LONG_DESCRIPTION 参见read方法说明
KEYWORDS 关于当前包的一些关键字,方便PyPI进行分类。
AUTHOR 谁是这个包的作者,写谁的名字吧
AUTHOR_EMAIL 作者的邮件地址
URL 你这个包的项目地址,如果有,给一个吧,没有你直接填写在PyPI你这个包的地址也是可以的
VERSION 当前包的版本,这个按你自己需要的版本控制方式来
LICENSE 授权方式
INSTALL_REQUIRES 模块所依赖的python模块

文中的classifiers的内容并不是随便填写的,你需要参照本文参考文档中的PyPI Classifiers来写

3、开始使用Distutils进行打包

为了保证效果,在打包之前我们可以验证setup.py的正确性,执行下面的代码
python setup.py check

输出一般是running check
如果有错误或者警告,就会在此之后显示
没有任何显示表示Distutils认可你这个setup.py文件。

如果没有问题,那么就可以正式打包,执行下面的代码:

python setup.py sdist

执行完成后,会在顶层目录下生成dist目录和egg目录

[html] view plain copy
tidy_page
├── tidy_page/dist
│ ├── tidy_page/dist/tidy-page-0.1.0.tar.gz
│ └── tidy_page/dist/tidy-page-0.1.1.tar.gz
├── tidy_page/LICENSE
├── tidy_page/README.rst
├── tidy_page/setup.py
├── tidy_page/tidypage
│ ├── tidy_page/tidypage/cleaners.py
│ ├── tidy_page/tidypage/extractor.py
│ ├── tidy_page/tidypage/__init__.py
│ └── tidy_page/tidypage/titles.py
├── tidy_page/tidy_page.egg-info
│ ├── tidy_page/tidy_page.egg-info/dependency_links.txt
│ ├── tidy_page/tidy_page.egg-info/PKG-INFO
│ ├── tidy_page/tidy_page.egg-info/requires.txt
│ ├── tidy_page/tidy_page.egg-info/SOURCES.txt
│ └── tidy_page/tidy_page.egg-info/top_level.txt

4、打包完成后就可以准备将打包好的模块上传到pypi了,首先你需要在pypi上进行注册 goto PyPI Live
注册完成后,你需要在本地创建好pypi的配置文件,不然有可能会出现使用http无法上传到pypi的问题
Create a .pypirc configuration file,在用户的home目录下创建.pypirc文件,文件的内容如下

[distutils]
index-servers =
pypi

[pypi]
repository=https://pypi.python.org/pypi
username=your_username
password=your_password

chmod 600 ~/.pypirc

python setup.py register -r pypi

在pypi上注册模块
python setup.py sdist upload -r pypi

上传python文件包,没有问题你就可以在pypi上看到你上传的包了
并且可以使用pip搜索和install你的python包了本回答被提问者和网友采纳
参考技术B 1.安装使用PyInstaller需要安装PyWin32。
下载与Python对应的PyInstaller版本, 解压后就算安装好了 。
2.生成exe文件
Python程序的目录为 F:\hello.py

在命令行 中进入pyinstaller所在的目录,运行python pyinstaller.py F:\hello.py

在PyInstaller-2.1目录下,生成文件夹hello

hello目录下有文件

exe文件在dist目录下

如果将python文件复制到 pyinstaller.py 所在目录下,则运行 python pyinstaller.py hello.py
3. pyinstaller的一些参数
(1) -F 制作独立的可执行程序,但是,运行生成的exe文件会包含警告。
参考技术C 直接问度娘啊

在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的集成。

 

以上是关于如何将自己的Python代码打包发布到pypi上的主要内容,如果未能解决你的问题,请参考以下文章

怎么将自己写的包打包上传到PyPi供其他人下载

Python 库打包分发简易指南

Head First Python(如何向PYPI发布你的代码)学习笔记

python发布自己的pip项目

如何把python代码上传到服务器上

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