乐趣区

关于android:Python打包setuptools

setuptools

Python 打包散发工具 setuptools: 已经 Python 的散发工具是 distutils,但它无奈定义包之间的依赖关系。setuptools 则是它的增强版,能帮忙咱们更好的创立和散发 Python 包,尤其是具备简单依赖关系的包。其通过增加一个根本的依赖零碎以及许多相干性能,补救了该缺点。他还提供了主动包查问程序,用来主动获取包之间的依赖关系,并实现这些包的装置,大大降低了装置各种包的难度,使之更加不便, 将程序打包当前能够能够装置到本人的虚拟环境中,也能够上传到 PyPI,这样十分不便大我的项目开发

setuptools 应用

pip 装置:

$ pip install setuptools

第一个安装文件 在目录 learn\_setup 下新建安装文件 setup.py,而后创立包 myapp 模仿要打包源码包:

├── myapp
│ └── __init__.py
└── setup.py

setup.py 文件内容如下:

from setuptools import setup

setup(
    name='firstApp001', # 利用名
    version='0.0.1', # 版本号
    packages=['myapp'], # 包含在安装包内的 Python 包
)

应用安装文件创立 wheel 有了下面的 setup.py 文件,咱们就能够打出各种安装包,次要分为两类:sdist 和 bdist。Source distribution 应用 sdist 能够打包成 source distribution,反对的压缩格局有:

应用形式为:

$ python setup.py sdist --formats=gztar,zip

目录下便会多出 dist 和 *.egg-info 目录,dist 内保留了咱们打好的包,下面命令应用 –formats 指定了打出 .tar.gz 和 .zip 包,如果不指定则如上表依据具体平台默认格局打包。包的名称为 setup.py 中定义的 name, version 以及指定的包格局,格局如:firstApp01-0.0.1.tar.gz。

Built distribution 应用 bdist 能够打出 built distribution,和源码包相比,因为事后构建好,所以装置更快:

应用上,和 sdist 一样,能够应用 –formats 指定包格局。如:

$ python setup.py bdist --formats=rpm

同时为了简化操作,setuptools 提供了如下命令:

所以下面打 rpm 包能够应用:

$ python setup.py bdist_rpm

Wheel Wheel 也是一种 built 包,而且是官网举荐的打包形式。兴许你已经遇见或应用过 egg 包,但当初 wheel 是官网举荐的打包形式 应用 wheel 打包,首先要装置 wheel:

$ pip install wheel

而后应用 bdist\_wheel 打包:

$ python setup.py bdist_wheel

执行胜利后,目录下除了 dist 和 *.egg-info 目录外,还有一个 build 目录用于存储打包两头数据。wheel 包的名称如 firstApp01-0.0.1-py3-none-any.whl,其中 py3 指明只反对 Python3。能够应用参数 –universal,包名如 mfirstApp-0.0.1-py2.py3-none-any.whl,表明 wheel 包同时反对 Python2 和 Python3 应用 universal 也成为通用 wheel 包,反之称为纯 wheel 包。

装置 Wheel 上一节的示例利用没有任何内容。上面增加模块 greet 并从新打包。

# greet.py
def hello():
    print('Hello, welcome to setuptools!')

应用 bdist\_wheel 再次打包后,咱们能够应用 pip 装置到本地 Python 的 site-packages 目录。

$ pip install dist/fisrtApp001-0.0.1-py3-none-any.whl

当初和其余应用 pip 装置的三方库一样应用:

from myapp.greet import hello
hello()

利用开发过程中会频繁变更,每次装置都须要先卸载旧版本很麻烦。应用 develop 开发模式装置的话,理论代码不会拷贝到 site-packages 下,而是除一个指向以后利用的链接(*.egg-link)。这样以后地位的源码改变就会马上反映到 site-packages。应用如下

$ pip install -e .  # 或者 python setup.py develop

要是须要卸载,就应用 pip uninstall 上传 Wheel 到 PyPI Wheel 包能够本人应用和传输给其他人应用,然而保护更新不不便,而 PyPI 作为 Python 的 软件仓库,让所有人能够不便的上传和下载,以及治理三方库。

注册 PyPI 账号 登录 pypi.python.org/pypi,进入 Register 注册账号。

装置 twine 尽管 setuptools 反对应用 setup.py upload 上传包文件到 PyPI,但只反对 HTTP 而被新的 twine 取代, 同样的,须要先装置 twine:

$ pip install twine

应用 twine 上传 应用 upload:

$ twine upload dist/*

输出 username 和 password 即上传至 PyPI。如果不想每次输出账号密码,能够在家目录下创立 .pypirc 文件,内容如下:

[distutils]
index-servers =
    pypi
    pypitest

[pypi]
username: 
password: 

[pypitest]
repository: https://test.pypi.org/legacy/
username: 
password:

填上本人的账号密码即可,这里配置了官网的 pypi 和 pypitest,若要配置其余仓库,按格局增加。回到 PyPI 主页即可看到上传的 firstApp001

setup() 参数

下面的 setup.py 安装文件内,咱们曾经应用了 setup() 一些参数:name, version, packages。version 我的项目版本号,个别由三局部组成:MAJOR, MINOR, MAINTENANCE。

  • MAJOR version when they make incompatible API changes,
  • MINOR version when they add functionality in a backwards-compatible manner, and
  • MAINTENANCE version when they make backwards-compatible bug fixes. 版本号的抉择参见:packaging.python.org/tutorials/d… packages: 列出我的项目内须要被打包的所有 package。个别应用 setuptools.find\_packages() 主动发现。
packages=find_packages(exclude=['contrib', 'docs', 'tests*'])
# exclude 用于排除不打包的 package

description:我的项目的简短形容,个别一句话就好,会显示在 PyPI 上名字下端。

description='My first Python project'

对我的项目的残缺形容,应用 long\_description。如果此字符串是 rst 格局的,PyPI 会主动渲染成 HTML 显示。也可指定应用 markdown。

long_description=long_description,
long_description_content_type='text/x-rst'

url: 通常为 GitHub 上 的链接或者 readthedocs 的链接。

url='https://github.com/pypa/sampleproject'

author: 作者信息

author='example',
author_email='example@example.com'

license: 我的项目许可证

license='MIT'

对于各种许可证的介绍和抉择,参考:choosealicense.com/ classifiers: 我的项目分类,残缺可选项参考:pypi.python.org/pypi?%3Aact…

classifiers=[
    # How mature is this project? Common values are
    # 3 - Alpha
    # 4 - Beta
    # 5 - Production/Stable
    'Development Status :: 3 - Alpha',

    # Indicate who your project is intended for
    'Intended Audience :: Developers',
    'Topic :: Software Development :: Build Tools',

    # Pick your license as you wish (should match "license" above)
     'License :: OSI Approved :: MIT License',

    # Specify the Python versions you support here. In particular, ensure
    # that you indicate whether you support Python 2, Python 3 or both.
    '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',
],

keywords: 我的项目关键词列表

keywords='sample setuptools development'

project\_urls: 我的项目相干额定连贯,如代码仓库,文档地址等。

project_urls={
    'Documentation': 'https://packaging.python.org/tutorials/distributing-packages/',
    'Funding': 'https://donate.pypi.org',
    'Say Thanks!': 'http://saythanks.io/to/example',
    'Source': 'https://github.com/pypa/sampleproject/',
    'Tracker': 'https://github.com/pypa/sampleproject/issues',
}

install\_requires: 我的项目依赖的 Python 库,应用 pip 装置本我的项目时会主动检查和装置依赖。

install_requires=['pyyaml']

依赖的装置参考:packaging.python.org/discussions… python\_requires: 指定我的项目依赖的 Python 版本

python_requires='>=3'

package\_data: 我的项目依赖数据文件,数据文件必须放在我的项目目录内且应用相对路径

package_data={'myapp': ['data/*.yml'],
}

如果不指定作为目录的键为空串,则代表对所有模块操作(下例中将蕴含所有包内 data 目录下的 yaml 文件):

package_data={'': ['data/*.yml'],
}

data\_files: 如果数据文件存在于我的项目外,则能够应用 data\_files 参数或者 MANIFEST.in 文件进行治理。如果用于源码包,则应用 MANIFEST.in;如果用于 wheel,则应用 data\_files。

data_files=[(‘mydata’, [‘data/conf.yml’])]

上述设置将在打包 wheel 时,将 data/conf.yml 文件增加至 mydata 目录。(data\_files 不能应用门路通配符) 此外,scripts, py\_modeles, entry\_points, console\_scripts 等参数参考:packaging.python.org/tutorials/d… 其余初始化文件 在浏览 Github 上的 Python 库时,除了最根本外围的 setup.py 文件和主程序之外,还会看到其余一些文件。本节将介绍它们的作用和应用办法。

setup.cfg 蕴含了构建时候的一些默认参数,如:

[bdist_wheel]
universal=1

用于在应用 bdist\_wheel 的时候的默认设置 –universal 参数。

README.rst/README.md: 我的项目阐明文档,应用 reStrutruedText 能够在 PyPI 上很好的渲染,但 Markdown 则反对不够好。

MANIFEST.in: 此文件在打源码包的时候通知 setuptools 还须要额定打包哪些文件。

# Include the README
include *.md

# Include the license file
include LICENSE.txt

# Include the data files
recursive-include data *

LICENSE.txt: 我的项目许可阐明文件 setuptools 默认打包的文件:README.rst/README.md、setup.cfg、MANIFEST.in 所以其余的文件,如 LICENSE.txt,在源码包时须要手动在 MANIFEST.in 里增加 include,在 wheel 包时须要在 setup.cfg 增加:

[metadata]
license_file = LICENSE.txt

PyPI 上传举荐配置

setup.py 
name
version
author
author_email
url
packages
description
package_data/data_files
setup.cfg
MANIFEST.in
README.rst
LICENSE.txt
< 我的项目 >

官网例子参考:

from setuptools import setup, find_packages
setup(
    name="HelloWorld",
    version="0.1",
    packages=find_packages(),
    scripts=['say_hello.py'],

    # Project uses reStructuredText, so ensure that the docutils get
    # installed or upgraded on the target machine
    install_requires=['docutils>=0.3'],

    package_data={
        # If any package contains *.txt or *.rst files, include them:
        '': ['*.txt','*.rst'],
        # And include any *.msg files found in the 'hello' package, too:
        'hello': ['*.msg'],
    },

    # metadata to display on PyPI
    author="Me",
    author_email="me@example.com",
    description="This is an Example Package",
    keywords="hello world example examples",
    url="http://example.com/HelloWorld/",   # project home page, if any
    project_urls={
        "Bug Tracker": "https://bugs.example.com/HelloWorld/",
        "Documentation": "https://docs.example.com/HelloWorld/",
        "Source Code": "https://code.example.com/HelloWorld/",
    },
    classifiers=['License :: OSI Approved :: Python Software Foundation License']

    # could also include long_description, download_url, etc.
)

参考:setuptools.readthedocs.io/en/latest/s…

本文转自 https://juejin.cn/post/6844903906158313485,如有侵权,请分割删除。

退出移动版