Py打包和发布(构建包文件、打包源码及wheel包、分发包)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44015805/article/details/101076449
'''
Py打包和发布.py
(构建包文件、打包源码及wheel包、分发包)

注意:
1、构建包目录结构时
包名称目录文件夹 与 setup.py等配置文件 在同级目录;而 模块文件 位于 包名称目录 之下。
2、打包时
运行打包指令后,包目录 及 配置文件的同级目录下多出三个目录结构,了解各个目录内容。
3、分发包时
如果包名称有重名则会上传失败。


使用:
一、构建包文件
首先创建 包目录 结构,其次开始编辑 包名称目录文件夹 的同级目录下的各个配置文件如:setup.py等
注意:
包名称目录文件夹 与 setup.py等配置文件 在同级目录;而 模块文件 位于 包名称目录 之下。
#---------------------------------
#包名称上级目录文件夹/
#    包名称目录文件夹/
#        __init__.py
#        模块1文件名称.py
#        模块2文件名称.py
#    setup.py
#    LICENSE.txt
#    README.md
#    ...
#---------------------------------

1、setup.py脚本文件(必须)
1.1、setup.py脚本提供了一些命令,可以当前文件目录下CMD命令用 python setup.py --help-commands 选项列出命令:
Python setup.py --help-commands
1.2、setup函数参数
#最重要的元数据以及一些其他参数

2、setup.cfg文件(可选)
setup.cfg 文件包含 setup.py 脚本命令的默认选项。
如果构建和分发包的过程更加复杂,并且需要向 setup.py 命令中传入许多可选参数,那么这个文件非常有用。
可以按项目将这些默认参数保存在代码中,这将使整个分发流程独立于项目之外,也能够让包的构建方式与向用户和其他团队成员的分发方式变得透明。

3、README.md文件()


二、打包源码及wheel包
构建 包目录 及 编辑模块文件和各配置文件 完毕后,则开始在本地进行打包操作。
在 setup.py配置文件 目录下运行CMD命令,如下:
1、python setup.py sdist bdist_wheel
2、python setup.py sdist
#sdist构建源代码发行版 和 bdist_wheel构建wheel包

#注意:
#运行1打包指令后,包目录 及 配置文件的同级目录下多出三个目录结构如下:
#-----------------------------------
#build/
#    bdist.win-amd64/
#        None
#    lib/
#        包名称/
#            __init__.py
#            模块名称.py
#            ...
#dist/
#    包名称-版本号.tar.gz
#    包名称-版本号-py2-none-any.whl
#包名称.egg—info/
#    ...
#    ...
#    ...
#-----------------------------------
#其中:
#build文件夹下 lib文件夹下 包名称目录内容 即 复制前面自建的包内容(包括__init__.py 和 模块.py)。
#dist文件夹下的内容 即 打包后的文件内容,分发上传到PyPI时候需要上传。



三、分发包
twine模块指令发包如下:
1、twine upload dist/*
2、twine upload dist/* -u PyPI用户名 -p PyPI密码

注意:
分发包如果包名称有重名则会上传失败。

分发完毕后,通过 pip install 包名称 即可进行下载包操作。




四、打包应用程序
'''


#第一部分  构建包文件


# =============================================================================
# #创建包目录结构
# #注意:包目录结构,包名称目录文件夹 与 setup.py等配置文件 在同级目录;而 模块文件 位于 包名称目录 之下。
# =============================================================================
#首先创建 包目录 结构如下:

# #注意:
#包目录结构,包名称目录文件夹 与 setup.py等配置文件 在同级目录;而 模块文件 位于 包名称目录 之下。
#---------------------------------
#包名称上级目录文件夹/
#    包名称目录文件夹/
#        __init__.py
#        模块1文件名称.py
#        模块2文件名称.py
#    setup.py
#    LICENSE.txt
#    README.md
#    ...
#---------------------------------
#其中需要编辑__init__.py文件,放入代码: name = "包名称",
#这只是为了让您可以在本教程后面验证它是否正确安装,并且PyPI不会使用它。


#其次开始编辑 包名称目录文件夹 的同级目录下的各个配置文件如:setup.py等。


# =============================================================================
# #setup.py文件(必须)
# #对于一个需要被分发的包来说,其根目录包含一个 setup.py 脚本,
# #它定义了 distutils 模块中描述的所有元数据,并将其合并为标准的 setup() 函数调用的参数。
# #虽然 distutils 是一个标准库模块,但建议使用 setuptools 包来代替,因为它对标准的 distutils 做了一些改进。
# =============================================================================

##########
#示例:
#简单的setup.py
from setuptools import setup

setup(name='Wodedigebao',
      version='0.0.1',
      description='zhe shi yige jianyi miaosu...',
      long_description='''
          zhe shi yige wanzheng shuomingneirong...''',
      install_requires=[                                             #管理依赖包参数
              'dependency1',
              'dependency2',
              'etc1',
              ]
      )
#使用:
#setup.py脚本提供了一些命令,可以当前文件目录下CMD命令用 python setup.py --help-commands 选项列出命令:
#Python setup.py --help-commands

#如:
#python setup.py sdist
#python setup.py sdist bdist_wheel
#以上两个均为打包指令。
#...

#在输出结果中:
#Standard commands(标准命令)  是 distutils 提供的内罝命令,
#Extra commands(额外命令)      则是由诸如 setuptools 这样的第三方包或任何其他定义并注册一个新命令的包所创建的。
#由另一个包注册的一个额外命令就是 wheel 包提供的 bdist_wheel。


##########
#最重要的元数据参数
#除了被分发包的名称和版本之外,setup 可以接受的最重要的参数包括:
#descriptions:                包含描述包的几句话。
#long_description:            包含完整说明,可以使用 reStructuredText 格式。
#keywords:                    定义包的关键字列表。
#authors:                     作者的姓名或组织。
#author_email:                联系人电子邮件地址。
#url:                         项目的 URL。
#license:                     许可证(GPL、LGPL等)
#packages:                    包中所有名称的列表,setuptools 提供了一个名为 find_packages 的小函数来计算它。
#namespace_packages:          命令空间包的列表。


##########
#trove分类器参数
#分类器列表在包定义中是作为 setup() 函数的 classifiers 参数。
#当前可用的 trove 分类器的完整列表可以用setup.py register --list-classifiers 命令来查看。

#示例  PyPI上某个项目的分类器列表示例(这里是 solrq 项目):
from setuptools import setup
setup(
    name="solrq",
    # (...)
    classifiers=[
        'Development Status :: 4 - Beta',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: BSD License',
        'Operating System :: OS Independent',
        'Programming Language :: Python',
        'Programming Language :: Python :: 2',
        'Programming Language :: Python :: 2.6',
        'Programming Language :: Python :: 2.7',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.2',
        'Programming Language :: Python :: 3.3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: Implementation :: PyPy',
        'Topic :: Internet :: WWW/HTTP :: Indexing/Search',
    ],
)

#PyPI 上目前共有 608 个可用的分类器,分为以下 9 类:
#1、开发状态(DevelopmentStatus)
#2、环境(Environment)
#3、框架(Framework)
#4、目标受众(IntendedAudience)
#5、许可证(License)
#6、自然语言(Natural Language)
#7、操作系统(Operating System)
#8、编程语言(Programming Language)
#9、话题(Topic)


##########
#install_requires管理依赖包参数
#正常依赖列表简单的话,采用[]列表形式即可
#如果依赖列表很长或其他原因使用独立的 requirements.txt 文件,则setup.py代码改进如下:
from setuptools import setup
import os

def strip_comments(L):
    return L.split('#',1)[0].strip()

def reps(*f):
    return list(filter(None,[strip_comments(L) for L in open(os.path.join(os.getcwd(),*f)).readlines()]))

setup(
      name='Wodediyigebao',
      install.requires=reps('requirements.txt')
      #...
      )




####################
#示例: Wodediyigebao
#setup.py
import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="wodediyigebao",
    version="0.0.1",
    author="XueHuangAoTian",
    author_email="[email protected]",
    description="zhe shi yige jiandan miaoshu...(A small example package)",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/pypa/sampleproject",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)






# =============================================================================
# #setup.cfg文件(可选)
# #setup.cfg 文件包含 setup.py 脚本命令的默认选项。如果构建和分发包的过程更加复杂,并且需要向 setup.py 命令中传入许多可选参数,那么这个文件非常有用。
# #可以按项目将这些默认参数保存在代码中,这将使整个分发流程独立于项目之外,也能够让包的构建方式与向用户和其他团队成员的分发方式变得透明。
# =============================================================================

#setup.cfg 文件的语法与内置 configparser 模块提供的语法相同,
#因此它类似于常见的 Microsoft Windows INI 文件。

#下面是安装配置文件的示例,提供了 global、sdist 和 bdist_wheel 命令的默认值,代码如下:
'''
[global]
quiet=1                         #全局 quiet 开关,每个命令的大部分输出都将被阻止。

[sdist]                       
formats=zip,tar                 #源代码发行版总是以两种格式创建(ZIP 和 TAR)

[bdist_wheel]                   
universal=1                     #构建 wheel 发行版将被创建为通用 wheel(与 Python 版本无关)
'''




# =============================================================================
# #README.txt文件(可选)
# #Python 包索引可以在 PyPI 门户的包页面中显示一个项目的 readme 或者 long_description 的值。
# #可以用 reStructuredText 标记语言来编写这个说明,它在上传时会转换为 HTML 格式。
# =============================================================================

#如果你想使用除了 rcStructurcdText 之外的标记语言来编写项目的 README,
#你仍然可以用可读的形式将它作为 PyPI 页面上的项目说明。
#
#诀窍是在将包上传到 Python 包索引时使用 pypandoc 包将你使用的其他脚本语言转换成 reStructuredText,
#同时准备 readme 文件的简单内容作为备用(fallback)也很重要,
#这样即使用户没有安装 pypandoc,安装也不会失败,
#setup.py代码如下:
from setuptools import setup
import os


try:
    from pypandoc import convert
    def read_md(f):
        return convert(f, 'rst')
except ImportError:
    convert = None
    print(
        "warning: pypandoc module not found, could not convert Markdown to RST"
    )
    def readjnd(f):
        return open(f, 'r').read() #noqa
    
README = os.path.join (os.path.dirname(__file__), 'README.md')                  #拼接目录,然后打开

setup(
    name='Wodediyigebao',
    long_description=read_md(README),
    #...
)


##########
#示例: wodediyigebao 的 README.md文件
#README.md
'''
# Example Package

This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.
'''




# =============================================================================
# #LICENSE.txt文件
# #创建许可证
# #上传到Python Package Index的每个包都包含许可证,这一点很重要。这告诉用户安装您的软件包可以使用您的软件包的条款。
# =============================================================================

#有关选择许可证的帮助,请访问 https://choosealicense.com/。
#选择许可证后,打开 LICENSE并输入许可证文本。例如,如果您选择了MIT许可证:


##########
#示例: wodediyigebao 的 许可证文件
#LICENSE.txt
'''
Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

'''










#第二部分  打包

#使用:
#setup.py脚本指令打包如下:

#1、python setup.py sdist bdist_wheel
#sdist构建源代码发行版 和 bdist_wheel构建wheel包

#2、python setup.py sdist
#sdist构建源代码发行版

#注意:
#运行1打包指令后,包目录 及 配置文件的同级目录下多出三个目录结构如下:
#-----------------------------------
#build/
#    bdist.win-amd64/
#        None
#    lib/
#        包名称/
#            __init__.py
#            模块名称.py
#            ...
#dist/
#    包名称-版本号.tar.gz
#    包名称-版本号-py2-none-any.whl
#包名称.egg—info/
#    ...
#    ...
#    ...
#-----------------------------------
#其中:
#build文件夹下 lib文件夹下 包名称目录内容 即 复制前面自建的包内容(包括__init__.py 和 模块.py)。
#dist文件夹下的内容 即 打包后的文件内容,分发上传到PyPI时候需要上传。



# =============================================================================
# #sdist发行版
# =============================================================================
#sdist 命令是最简单的命令,它创建一棵分发树,其中复制了运行一个包所需要的全部内容,
#这棵树被归档到一个或多个存档文件中(通常只创建一个 tar 文件),这个存档基本上是源代码树的副本。
#
#这个命令是从目标系统独立地分发一个包的最简单方法,它将创建一个 dist 文件夹,里面包含可被分发的存档。
#为了能够使用它,必须向 setup 传递一个额外参数以提供版本号,如果没有提供 version 值,那它默认为 version = 0.0.0

#命令如下:
#python setup.py sdist
#sdist构建源代码发行版










#第三部分  分发包

#twine模块 作为 setup.py upload 的安全替代。
#twine模块 是与 PyPI 交互的实用程序,目前只有一个作用,就是将包安全地上传到仓库中。
#twine模块 支持任何打包格式,并始终确保连接安全,它还允许上传已经创建的文件,这样能够在发布之前对发行版进行测试。

#使用:
#twine模块指令发包如下:
#1、twine upload dist/*
#2、twine upload dist/* -u PyPI用户名 -p PyPI密码

#注意:
#分发包如果包名称有重名则会上传失败。

#分发完毕后,通过 pip install 包名称 即可进行下载包操作。


















猜你喜欢

转载自blog.csdn.net/weixin_44015805/article/details/101076449