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

最简单的setup.py配置文件内容:

#setup.py

import setuptools

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

setuptools.setup(
    name="包名称",                                           # 包的分发名称,使用字母、数字、_、-
    version="0.0.1",                                        # 版本号, 版本号规范:https://www.python.org/dev/peps/pep-0440/
    author="ker945",                                        # 作者名字
    author_email="290510968@qq.com",                        # 作者邮箱
    description="PyPI Tutorial",                            # 包的简介描述
    long_description=long_description,                      # 包的详细介绍(一般通过加载README.md)
    long_description_content_type="text/markdown",          # 和上条命令配合使用,声明加载的是markdown文件
    url="https://github.com/ker945/项目名称",                # 项目开源地址,我这里写的是同性交友官网,大家可以写自己真实的开源网址
    packages=setuptools.find_packages(),                    # 如果项目由多个文件组成,我们可以使用find_packages()自动发现所有包和子包,而不是手动列出每个包,在这种情况下,包列表将是example_pkg
    classifiers=[                                           # 关于包的其他元数据(metadata)
        "Programming Language :: Python :: 3",              # 该软件包仅与Python3兼容
        "License :: OSI Approved :: MIT License",           # 根据MIT许可证开源
        "Operating System :: OS Independent",               # 与操作系统无关
    ],
)

# 这是最简单的配置
# 有关详细信息,请参阅(https://packaging.python.org/guides/distributing-packages-using-setuptools/)

#这里是最简单的配置,有关详细信息,请参阅打包和分发项目。

下面正文:
其他参考网址:https://blog.csdn.net/qq_27884799/article/details/96664812

注意: 编写注释和类型提示。尤其是针对对外暴露的方法编写注释。
使用一对三双引号,是python中函数和类注释文档的规范。
函数写完后输入三个",pycharm会自动帮你形成文档骨架。
.
:param表示参数,随后写参数的类型,最后是参数名,比如参数a的类型就是str/unicode/list/tuple/dict中的一种(实际上这显然是针对python2,3里面应该对应bytes,但这样写无妨),而参数ignore_list_seq类型则是bool。return下面也要写明返回值的类型。
.
这些类型不是必需的,但是有诸多好处。
诸如Pycharm这样的IDE会自动针对返回值和参数提供类型提示和方法联想,比如若你使用了这个函数的返回值变量,那只有在返回值被注释为str类型或者IDE能自己判断出返回类型时,才会给你提供.join等方法的联想。同时,当用户传错了参数类型时,也会被IDE提示警告,从而引起用户警觉。这类动态语言应该非常注意类型的校验,否则容易发生幽灵bug,且代码的可读性,可调试性都会变差。
在这里插入图片描述


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="83127632@qq.com",
    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 包名称 即可进行下载包操作。









pip是python内置的非常好用的下载工具,基本可以下载全部的python库。
它还有一个非常好的特点,当你安装一个库的时候,它会自动帮你安装所有这个库的依赖库。完全一键式操作。非常方便。但是由于pipy网站是国外网站,很容易会被墙,导致经常下载速度非常慢,经常超时。
解决方式: 更改pip的数据源。目前国内比较知名的有豆瓣的,清华的。都是pipy官网的镜像。
豆瓣:http://pypi.douban.com/simple/
清华:https://pypi.tuna.tsinghua.edu.cn/simple

安装命名为 pip install -i 网址 所需要安装的库名 例如:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
就是利用清华的镜像源,下载安装requests库。其他类似

除此之外,还可以通过设置配置文件永久更改pip数据源

  1. windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,写入内容如下:
    [global]
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple

  2. ubuntu下,修改配置文件:~/.config/pip/pip.conf (Linux), (没有就创建一个), 将
    index-url改成至tuna,例如 在.config文件夹中创建pip/pip.conf
    sudo mkdir pip // #创建pip文件夹
    cd pip touch pip.conf // #创建pip.cong文件
    sudo vim pip.conf // #编辑pip.conf文件
    写入内容:
    [global]
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple


注意:如果ubuntu下pip install后显示问题:ValueError: Unable to determine SOCKS version from socks,则执行如下指令取消当前设置代理环境变量即可:
unset all_proxy && unset ALL_PROXY

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值