Skip to content

Alinvor/Python-DeMo

Repository files navigation

Python-DeMo

Python Logo

一. 构建venv环境

首先检查是否安装如下软件包:

# python2
python2 -m pip --version
python2 -m setuptools --version
python2 -m wheel --version
python2 -m virtualenv --version


# python3
python3 -m pip --version
python3 -m setuptools --version
python3 -m wheel --version
python3 -m virtualenv --version

如果没有,请安装如下软件包:

# python2
python2 -m pip install setuptools wheel virtualenv
或
python2 -m pip install virtualenv

# python3
python3 -m pip install setuptools wheel virtualenv
或
python3 -m pip install virtualenv

1.1 venv2

1.1.1 venv2 for mac

1.1.1.1 venv2 16.7.5
python2 -m virtualenv -p /usr/local/bin/python2 --no-site-packages venv2
1.1.1.2 venv2 20.4.6
python2 -m virtualenv -p /usr/local/bin/python2 venv2

1.1.2 venv2 for windows

python2 -m virtualenv -p C:\Python\Python27\python2.exe venv2

或

python2 -m virtualenv -p C:\Python\Python27\python2.exe venv2 > venv2.log

1.2 venv3

1.2.1 venv3 for mac

1.2.1.1 venv3 16.7.5
python3 -m virtualenv -p /usr/local/bin/python3 --no-site-packages venv
1.2.1.2 venv3 20.4.6
python3 -m virtualenv -p /usr/local/bin/python3 venv

1.2.2 venv3 for windows

python3 -m virtualenv -p C:\Python\Python38\python3.exe venv

或

python3 -m virtualenv -p C:\Python\Python38\python3.exe venv > venv.log

二. 多模块配置

具体步骤:

  1. venv2venv 下新建一个python.pth文件,具体目录为venv2/lib/python2.x/site-packages/python.pthvenv/lib/python3.x/site-packages/python.pth;
  2. 在上述python.pth文件中写入多模块的绝对路径(自己设备上实际目录);
# venv2 环境
# /Users/.../Python-DeMo/venv2/lib/python2.x/site-packages/python.pth
#
# venv 环境
# /Users/.../Python-DeMo/venv/lib/python3.x/site-packages/python.pth

/Users/.../Python-DeMo/src
/Users/.../Python-DeMo/test
/Users/.../Python-DeMo/mock
/Users/.../Python-DeMo/case

三. venvX activate and deactivate

3.1 venvX activate

3.1.1 activate for mac

在控制台中输入如下命令,使得Mac 环境下的 virtualenv 生效:

# python2
source ./venv2/bin/activate


# python3
source ./venv/bin/activate

3.1.2 activate for windows

在控制台中输入如下命令,使得Windows 环境下的 virtualenv 生效:

# python2
./venv2/Scripts/activate


# python3
./venv/Scripts/activate

四. 脚本

4.1 python version

# python
python2 --version
python3 --version
# python help
python2 --help > ./Temp/help/python2_help.txt
python3 --help > ./Temp/help/python3_help.txt

4.2 pip setuptools wheel version

# pip
python2 -m pip --version
python3 -m pip --version

# pip setuptools wheel help
python2 -m pip --help > ./Temp/help/python2_pip_help.txt
python3 -m pip --help > ./Temp/help/python3_pip_help.txt
## python2 -m setuptools --help > ./Temp/help/python2_setuptools_help.txt
## python3 -m setuptools --help > ./Temp/help/python3_setuptools_help.txt
python2 -m setup.py --help-commands > ./Temp/help/python2_setuptools_help.txt
python3 -m setup.py --help-commands > ./Temp/help/python3_setuptools_help.txt
python2 -m wheel --help > ./Temp/help/python2_wheel_help.txt
python3 -m wheel --help > ./Temp/help/python3_wheel_help.txt

4.2.1 pip freeze list

# pip freeze
python2 -m pip freeze > ./Temp/python2_pip_freeze.txt
python3 -m pip freeze > ./Temp/python3_pip_freeze.txt
python2 -m pip list > ./Temp/python2_pip_list.txt
python3 -m pip list > ./Temp/python3_pip_list.txt

4.2.2 pip cache

# pip cache list
python2 -m pip cache list > ./out/dist/python2_pip2_cache_list.txt
python3 -m pip cache list > ./out/dist/python3_pip3_cache_list.txt
# pip no cache install
python2 -m pip --no-cache-dir install com.dvsnier.*
python3 -m pip --no-cache-dir install com.dvsnier.*
# pip remove cache package with whl
python2 -m pip cache remove com.dvsnier.*
python3 -m pip cache remove com.dvsnier.*

4.2.3 setuptools

4.2.3.1 setup.cfg
# python2 build
python2 -m pip install build
python2 -m pip install --upgrade build
python2 -m build
python2 -m build > ./out/dist/build.txt

# python3 build
python3 -m pip install build
python3 -m pip install --upgrade build
python3 -m build
python3 -m build > ./out/dist/build.txt
4.2.3.2 setup.py
# setup sdist
python2 setup.py sdist > ./out/dist/setup2_sdist.txt
python3 setup.py sdist > ./out/dist/setup3_sdist.txt

python2 setup.py bdist_wheel --universal
python3 setup.py bdist_wheel --universal

python2 setup.py bdist_wheel
python3 setup.py bdist_wheel

4.3 virtualenv version

# virtualenv
python2 -m virtualenv --version
python3 -m virtualenv --version
# virtualenv help
python2 -m virtualenv --help > ./Temp/help/python2_virtualenv_help.txt
python3 -m virtualenv --help > ./Temp/help/python3_virtualenv_help.txt

4.4 tox tox-travis version

# tox
python2 -m tox --version
# python2 -m tox-travis --version
python3 -m tox --version
# python3 -m tox-travis --version
# tox tox-travis help
python2 -m tox --help > ./Temp/help/python2_tox_help.txt
# python2 -m tox-travis --help > ./Temp/help/python2_tox_travis_help.txt
python3 -m tox --help > ./Temp/help/python3_tox_help.txt
# python3 -m tox-travis --help > ./Temp/help/python3_tox_travis_help.txt

如若快捷生成脚本,参考如下命令:

tox-quickstart

默认运行命令,如下:

tox

# the recommend
tox --result-json ./Temp/tox/python2_tox_result.json
tox --result-json ./Temp/tox/python3_tox_result.json

4.5 twine version

# twine
python2 -m twine --version
python3 -m twine --version
# twine help
python2 -m twine --help > ./Temp/help/python2_twine_help.txt
python3 -m twine --help > ./Temp/help/python3_twine_help.txt

# check python check and upload dist format
twine check dist/*
twine upload dist/*

五. 构建与分发

Python 软件包开发工程结构,如下所示:

# soft package tree

--- project root
    |
    | --- .tox
    | --- .vscode
    | --- build
    | --- dist
    | --- doc
        --- ...
            --- README.md
    | --- out
    | --- src
        --- com
            --- dvsnier
                --- ...
    | --- Temp
    | --- template
    | --- tests
        --- com
            --- dvsnier
                --- ...
    | --- venv
    | --- venv2
    | --- .editorconfig
    | --- .env
    | --- .gitignore
    | --- .rmcache.bash
    | --- .rmcache.ps1
    | --- LICENSE.txt
    | --- MANIFEST.in
    | --- pyproject.toml
    | --- README.md
    | --- requirements.txt
    | --- setup.cfg
    | --- tox.ini

5.1 安装

首先检查是否安装如下依赖:

  1. build
  2. discover
  3. flake8 (可选)
  4. pip
  5. setuptools
  6. tox
  7. toml (可选)
  8. tox-travis (可选)
  9. twine
  10. unittest2
  11. virtualenv
  12. wheel

如若没有,请使用pip 命令安装如下软件包:

# python2 pip version
python2 -m pip --version

python2 -m pip install build
python2 -m pip install discover
python2 -m pip install flake8
python2 -m pip install pip
python2 -m pip install setuptools
python2 -m pip install tox
python2 -m pip install toml
python2 -m pip install tox-travis
python2 -m pip install twine
python2 -m pip install unittest2
python2 -m pip install virtualenv
python2 -m pip install wheel

# python3 pip version
python3 -m pip --version

python3 -m pip install build
python3 -m pip install discover
python3 -m pip install flake8
python3 -m pip install pip
python3 -m pip install setuptools
python3 -m pip install tox
python3 -m pip install toml
python3 -m pip install tox-travis
python3 -m pip install twine
python3 -m pip install unittest2
python3 -m pip install virtualenv
python3 -m pip install wheel

其实一般安装有 pip 软件包的,一般都会有setuptoolswheel 软件包附带安装;

5.2 配置

5.2.1 pyproject.toml

首先配置 pyproject.toml ,模板固定, 一般不需大范围改动;

[build-system]
# https://setuptools.readthedocs.io/en/latest/build_meta.html
# These are the assumed default build requirements from pip:
# https://pip.pypa.io/en/stable/cli/pip/#pep-517-and-518-support
#
# As of version 10.0, pip supports projects declaring dependencies that are
# required at install time using a pyproject.toml file, in the form described
# in PEP 518. When building a project, pip will install the required
# dependencies locally, and make them available to the build process.
# Furthermore, from version 19.0 onwards, pip supports projects specifying the
# build backend they use in pyproject.toml, in the form described in PEP 517.
#
requires = [
    "setuptools>=40.8.0",
    "wheel"
]
build-backend = "setuptools.build_meta"

5.2.2 MANIFEST.in

然后配置 MANIFEST.in 软件包应当包含哪些信息,哪些排除配置信息, 如下所示:

# https://packaging.python.org/guides/using-manifest-in/

include pyproject.toml

# Include the README
include *.md

# Include the license file
include LICENSE.txt

# # Include the requirements file
include requirements.txt

同上,模板一般都是固定结构,无需太范围改动;

5.2.3 tox.ini

再然后配置 tox 脚本自动化测试, 指定Python 虚拟环境版本, 配置信息如下:

# tox (https://tox.readthedocs.io/) is a tool for running tests
# in multiple virtualenvs. This configuration file will run the
# test suite on all supported python versions. To use it, "pip install tox"
# and then run "tox" from this directory.
# For information see https://tox.readthedocs.io/en/latest/examples.html

[tox]
envlist = py27, py38

minversion = 3.23.1

# Activate isolated build environment. tox will use a virtual environment
# to build a source distribution from the source tree. For build tools and
# arguments use the pyproject.toml file as specified in PEP-517 and PEP-518.
isolated_build = true

# install testing framework
# ... or install anything else you might need here
[testenv]
passenv =
    PYTHONPATH
platform = linux: linux
           macos: darwin
           windows: win32
; alwayscopy = True
allowlist_externals =
    /bin/bash
; changedir =
;     tests
#
# https://tox.readthedocs.io/en/latest/config.html#conf-deps
# https://tox.readthedocs.io/en/latest/example/basic.html#a-simple-tox-ini-default-environments
#
deps =
    -rrequirements.txt
    unittest2
    flake8
    virtualenv
    setuptools
    wheel
    discover
    tox
    toml
    tox-travis
    build
    twine
commands =
    ; windows: python --version
    ; macos,linux: python --version
    discover -s ./tests -t .
    ; unit2 discover []
    ; python -m unittest discover

5.2.4 setup.cfg

最后配置 setup.cfg 构建脚本, 指定软件包所要构建的软件细节部分, 举例配置信息如下:

[metadata]
# 1. https://setuptools.readthedocs.io/en/latest/
# 2. https://setuptools.readthedocs.io/en/latest/userguide/declarative_config.html
# 3. https://setuptools.readthedocs.io/en/latest/references/keywords.html
name = com.dvsnier.xxx
version = 0.0.1.dev1
author = dvsnier
author_email = dovsnier@qq.com
description = this is dvsnier xxx.
long_description = file: ./doc/description/xxx/README.md
long_description_content_type = text/markdown
keywords = xxx, development
url = https://github.com/Alinvor/Python-DeMo
project_urls =
    Documentation = https://packaging.python.org/tutorials/distributing-packages/
    Funding = https://donate.pypi.org
    Wiki = https://github.com/Alinvor/Python-DeMo/wiki
    Bug_Tracker = https://github.com/Alinvor/Python-DeMo/issues
    Source = https://github.com/Alinvor/Python-DeM
platforms = any
# classifiers
# Development Status :: 3 - Alpha
# Development Status :: 4 - Beta
# Development Status :: 5 - Production/Stable
classifiers =
    Development Status :: 3 - Alpha
    Topic :: Software Development :: Libraries
    License :: OSI Approved :: MIT License
    Programming Language :: Python :: 2.7
    Programming Language :: Python :: 3.8
    Programming Language :: Python :: 3.9

python_requires =
    >=2.7
    <4

# This includes the license file(s) in the wheel.
# https://wheel.readthedocs.io/en/stable/user_guide.html#including-license-files-in-the-generated-wheel-file
# https://choosealicense.com/
license = MIT License
license_files =
    LICENSE.txt

[options]
package_dir =
    = src

packages = find:

[options.packages.find]
where = src
#
# https://packaging.python.org/guides/distributing-packages-using-setuptools/#wheels
#
[bdist_wheel]
universal = 1

软件包名称和软件包版本信息, 一定要明确具体发布规则;

实际项目中, 可依据如上配置信息稍加修改和增添;

5.2.5 setup.py

最后配置 setup.py 构建脚本, 指定软件包所要构建的软件细节部分, 举例配置信息如下:

# -*- coding:utf-8 -*-
"""A setuptools based setup module.

See:
https://packaging.python.org/guides/distributing-packages-using-setuptools/
https://github.com/Alinvor/Python-DeMo
"""

# Always prefer setuptools over distutils
# from setuptools import setup, find_packages, find_namespace_packages
from setuptools import setup, find_packages
import os
import sys


def read_text(file_name):
    ''' the read describe readme files content. '''
    content = ''
    with open(file_name, 'r') as file:
        lines = file.readlines()
        for line in lines:
            if sys.version_info.major > 2:
                content += str(line)
            else:
                content += str(line).encode('utf-8')
    # print(content)
    return content


project = os.getenv('BASE_PROJECT_PREFIX')
if project is None:
    raise KeyError('the please configure BASE_PROJECT_PREFIX environment variable, otherwise it cannot run')
print(project)
PROJECT_DIRECTORY = 'xxx'  # project directory
PROJECT_README_FILE = 'README.md'  # project readme file
README_ROOT_DIRECTORY = os.path.join(project, 'doc/description')
README_PROJECT_DIRECTORY = os.path.join(README_ROOT_DIRECTORY, PROJECT_DIRECTORY)
PROJECT_DESCRIPTION = os.path.join(README_PROJECT_DIRECTORY, PROJECT_README_FILE)
#
# Arguments marked as "Required" below must be included for upload to PyPI.
# Fields marked as "Optional" may be commented out.
#
# |  序列  |                 字段                  |   数据类型   |  选项  |  描述                 | 备注 |
# | :---: | :-----------------------------------: | :---------: | :---: | -------------------- | ---- |
# |   1   |             DVSNIER_NAME              |   string    |   Y   | 包名称                |      |
# |   2   |            DVSNIER_VERSION            |   string    |   Y   | 包版本                |      |
# |   3   |          DVSNIER_DESCRIPTOIN          |   string    |       | 包简单描述             |      |
# |   4   |       DVSNIER_LONG_DESCRIPTOIN        |    file     |       | 较长文档描述           |      |
# |   5   | DVSNIER_LONG_DESCRIPTION_CONTENT_TYPE |   string    |       | 长文本类型描述          |      |
# |   6   |              DVSNIER_URL              |    http     |       | 项目主页               |      |
# |   7   |            DVSNIER_AUTHOR             |   string    |       | 项目作者               |      |
# |   8   |         DVSNIER_AUTHOR_EMAIL          |    email    |       | 项目作者邮箱           |      |
# |   9   |         DVSNIER_LICENSE               |    许可证    |       | 许可证                |      |
# |  10   |          DVSNIER_CLASSIFIERS          | classifiers |       | 项目分类器             |      |
# |  11   |           DVSNIER_KEYWORDS            |  keywords   |       | 项目关键字             |      |
# |  12   |          DVSNIER_PACKAGE_DIR          |   string    |       | 包目录                |      |
# |  13   |          DVSNIER_PY_MODULES           |   string    |   Y   | 模块名称               |      |
# |  14   |           DVSNIER_PACKAGES            |   string    |   Y   | 包名称                 |      |
# |  15   |        DVSNIER_PYTHON_REQUIRES        |   string    |   Y   | 版本匹配分类器描述符     |      |
# |  16   |       DVSNIER_INSTALL_REQUIRES        |    list     |       | 依赖库                 |      |
# |  17   |        DVSNIER_EXTRAS_REQUIRE         |    dict     |       | 附加/扩展依赖           |      |
# |  18   |         DVSNIER_PACKAGE_DATA          |    dict     |       | 包数据文件              |      |
# |  19   |          DVSNIER_DATA_FILES           |    list     |       | 包外数据文件            |      |
# |  20   |         DVSNIER_ENTRY_POINTS          |    dict     |       | 入口点                 |      |
# |  21   |         DVSNIER_PROJECT_URLS          |    dict     |       | 项目 URL               |      |
# |  22   |                                       |             |       |                       |      |
DVSNIER_NAME = 'com.dvsnier.xxx'  # Required
DVSNIER_VERSION = '0.0.1.dev0'  # Required
DVSNIER_DESCRIPTOIN = 'this is dvsnier xxx.'  # Optional
# Get the long description from the README file
DVSNIER_LONG_DESCRIPTOIN = read_text(str(PROJECT_DESCRIPTION))  # Optional
DVSNIER_LONG_DESCRIPTION_CONTENT_TYPE = 'text/markdown'  # Optional
DVSNIER_URL = 'https://github.com/Alinvor/Python-DeMo'  # Optional
DVSNIER_AUTHOR = 'dvsnier'  # Optional
DVSNIER_AUTHOR_EMAIL = 'dovsnier@qq.com'  # Optional
DVSNIER_LICENSE = 'MIT'  # Optional
DVSNIER_CLASSIFIERS = [  # Optional
    # 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',
    'Topic :: Software Development :: Libraries',

    # Pick your license as you wish
    'License :: OSI Approved :: MIT License',

    # Specify the Python versions you support here. In particular, ensure
    # that you indicate you support Python 3. These classifiers are *not*
    # checked by 'pip install'. See instead 'python_requires' below.
    'Programming Language :: Python :: 2.7',
    'Programming Language :: Python :: 3.8',
    'Programming Language :: Python :: 3.9',
    # 'Programming Language :: Python :: 3 :: Only',
    # 'Operating System :: OS Independent'
]
DVSNIER_KEYWORDS = 'xxx, development'  # Optional
DVSNIER_PACKAGE_DIR = {'': 'src'}  # Optional
# DVSNIER_PY_MODULES = ["xxx"]  # Required
# DVSNIER_PACKAGES = find_packages(include=['xxx', 'xxx.*'])  # Required
DVSNIER_PACKAGES = find_packages(where='src')  # Required
# DVSNIER_NAMESPACE_PACKAGES = find_namespace_packages(include=['com.*'])  # Required
# DVSNIER_PYTHON_REQUIRES = '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*'
DVSNIER_PYTHON_REQUIRES = '>=2.7, <4'
DVSNIER_INSTALL_REQUIRES = [  # Optional

]
DVSNIER_EXTRAS_REQUIRE = {  # Optional
    'dev': ['check-manifest'],
    'test': ['coverage']
}
DVSNIER_PACKAGE_DATA = {  # Optional
    # 'sample': ['package_data.dat'],
}
DVSNIER_DATA_FILES = [  # Optional
    # ('my_data', ['data/data_file'])
]
DVSNIER_ENTRY_POINTS = {  # Optional
    # 'console_scripts': [
    #     'dvs-dir=dvs:main',
    # ],
}
DVSNIER_PROJECT_URLS = {  # Optional
    'Bug_Tracker': 'https://github.com/Alinvor/Python-DeMo/issues',
    'Documentation': 'https://packaging.python.org/tutorials/distributing-packages/',
    'Funding': 'https://donate.pypi.org',
    'Wiki': 'https://github.com/Alinvor/Python-DeMo/wiki',
    'Source': 'https://github.com/Alinvor/Python-DeMo'
}

setup(
    # This is the name of your project. The first time you publish this
    # package, this name will be registered for you. It will determine how
    # users can install this project, e.g.:
    #
    # $ pip install com.dvsnier.xxx
    #
    # And where it will live on PyPI: https://pypi.org/project/com.dvsnier.xxx/
    #
    # There are some restrictions on what makes a valid project name
    # specification here:
    # https://packaging.python.org/specifications/core-metadata/#name
    name=DVSNIER_NAME,  # Required

    # Versions should comply with PEP 440:
    # https://www.python.org/dev/peps/pep-0440/
    # https://semver.org/lang/zh-CN/
    #
    # 1.2.0.dev1   Development release
    # 1.2.0a1      Alpha Release
    # 1.2.0b1      Beta Release
    # 1.2.0rc1     Release Candidate
    # 1.2.0        Final Release
    # 1.2.0.post1  Post Release
    # 15.10        Date based release
    # 23           Serial release
    #
    # For a discussion on single-sourcing the version across setup.py and the
    # project code, see
    # https://packaging.python.org/en/latest/single_source_version.html
    version=DVSNIER_VERSION,  # Required

    # This is a one-line description or tagline of what your project does. This
    # corresponds to the "Summary" metadata field:
    # https://packaging.python.org/specifications/core-metadata/#summary
    description=DVSNIER_DESCRIPTOIN,  # Optional

    # This is an optional longer description of your project that represents
    # the body of text which users will see when they visit PyPI.
    #
    # Often, this is the same as your README, so you can just read it in from
    # that file directly (as we have already done above)
    #
    # This field corresponds to the "Description" metadata field:
    # https://packaging.python.org/specifications/core-metadata/#description-optional
    long_description=DVSNIER_LONG_DESCRIPTOIN,  # Optional

    # Denotes that our long_description is in Markdown; valid values are
    # text/plain, text/x-rst, and text/markdown
    #
    # Optional if long_description is written in reStructuredText (rst) but
    # required for plain-text or Markdown; if unspecified, "applications should
    # attempt to render [the long_description] as text/x-rst; charset=UTF-8 and
    # fall back to text/plain if it is not valid rst" (see link below)
    #
    # This field corresponds to the "Description-Content-Type" metadata field:
    # https://packaging.python.org/specifications/core-metadata/#description-content-type-optional
    long_description_content_type=DVSNIER_LONG_DESCRIPTION_CONTENT_TYPE,  # Optional (see note above)

    # This should be a valid link to your project's main homepage.
    #
    # This field corresponds to the "Home-Page" metadata field:
    # https://packaging.python.org/specifications/core-metadata/#home-page-optional
    url=DVSNIER_URL,  # Optional

    # This should be your name or the name of the organization which owns the project.
    author=DVSNIER_AUTHOR,  # Optional

    # This should be a valid email address corresponding to the author listed above.
    author_email=DVSNIER_AUTHOR_EMAIL,  # Optional

    # The license argument doesn’t have to indicate the license under which your package is being released,
    # although you may optionally do so if you want. If you’re using a standard, well-known license, then
    # your main indication can and should be via the classifiers argument. Classifiers exist for all major
    #  open-source licenses.
    license=DVSNIER_LICENSE,  # Optional

    # Classifiers help users find your project by categorizing it.
    #
    # For a list of valid classifiers, see https://pypi.org/classifiers/
    classifiers=DVSNIER_CLASSIFIERS,  # Optional

    # This field adds keywords for your project which will appear on the
    # project page. What does your project relate to?
    #
    # Note that this is a list of additional keywords, separated
    # by commas, to be used to assist searching for the distribution in a
    # larger catalog.
    keywords=DVSNIER_KEYWORDS,  # Optional

    # When your source code is in a subdirectory under the project root, e.g.
    # `src/`, it is necessary to specify the `package_dir` argument.
    package_dir=DVSNIER_PACKAGE_DIR,  # Optional

    # You can just specify package directories manually here if your project is
    # simple. Or you can use find_packages().
    #
    # Alternatively, if you just want to distribute a single Python file, use
    # the `py_modules` argument instead as follows, which will expect a file
    # called `my_module.py` to exist:
    #
    #   py_modules=["my_module"],
    #
    packages=DVSNIER_PACKAGES,  # Required

    #
    # Only for Python 3.x and above
    #
    # namespace_packages=DVSNIER_NAMESPACE_PACKAGES, # Optional

    # If your project contains any single-file Python modules that aren’t part of
    # a package, set py_modules to a list of the names of the modules (minus the .py
    # extension) in order to make setuptools aware of them.
    # py_modules=DVSNIER_PY_MODULES,  # Required

    # Specify which Python versions you support. In contrast to the
    # 'Programming Language' classifiers above, 'pip install' will check this
    # and refuse to install the project if the version does not match. See
    # https://packaging.python.org/guides/distributing-packages-using-setuptools/#python-requires
    python_requires=DVSNIER_PYTHON_REQUIRES,

    # This field lists other packages that your project depends on to run.
    # Any package you put here will be installed by pip when your project is
    # installed, so they must be valid existing projects.
    #
    # For an analysis of "install_requires" vs pip's requirements files see:
    # https://packaging.python.org/en/latest/requirements.html
    # https://packaging.python.org/discussions/install-requires-vs-requirements/
    install_requires=DVSNIER_INSTALL_REQUIRES,  # Optional

    # List additional groups of dependencies here (e.g. development
    # dependencies). Users will be able to install these using the "extras"
    # syntax, for example:
    #
    #   $ pip install sampleproject[dev]
    #
    # Similar to `install_requires` above, these must be valid existing projects.
    extras_require=DVSNIER_EXTRAS_REQUIRE,  # Optional

    # If there are data files included in your packages that need to be
    # installed, specify them here.
    # https://setuptools.readthedocs.io/en/latest/userguide/datafiles.html
    package_data=DVSNIER_PACKAGE_DATA,  # Optional

    # Although 'package_data' is the preferred approach, in some case you may
    # need to place data files outside of your packages. See:
    # http://docs.python.org/distutils/setupscript.html#installing-additional-files
    # http://docs.python.org/3/distutils/setupscript.html#installing-additional-files
    #
    # In this case, 'data_file' will be installed into '<sys.prefix>/my_data'
    data_files=DVSNIER_DATA_FILES,  # Optional

    # To provide executable scripts, use entry points in preference to the
    # "scripts" keyword. Entry points provide cross-platform support and allow
    # `pip` to create the appropriate form of executable for the target
    # platform.
    #
    # For example, the following would provide a command called `dvsnier` which
    # executes the function `main` from this package when invoked:
    entry_points=DVSNIER_ENTRY_POINTS,  # Optional

    #
    # 1. https://www.python.org/dev/peps/pep-0328/
    # 2. https://setuptools.readthedocs.io/en/latest/userguide/package_discovery.html
    # 3. https://packaging.python.org/guides/packaging-namespace-packages/
    # 4. https://github.com/pypa/sample-namespace-packages/tree/master/pkgutil
    #
    zip_safe=False,

    # List additional URLs that are relevant to your project as a dict.
    #
    # This field corresponds to the "Project-URL" metadata fields:
    # https://packaging.python.org/specifications/core-metadata/#project-url-multiple-use
    #
    # Examples listed include a pattern for specifying where the package tracks
    # issues, where the source is hosted, where to say thanks to the package
    # maintainers, and where to support the project financially. The key is
    # what's used to render the link text on PyPI.
    project_urls=DVSNIER_PROJECT_URLS,  # Optional
)

软件包名称和软件包版本信息, 一定要明确具体发布规则;

实际项目中, 可依据如上配置信息稍加修改和增添;

5.2.6 README.md

更新README.md 版本和摘要信息;

5.3 构建

5.3.1 tox 脚本测试

首次运行tox 命令,可使用tox-quickstart 命令, 依据简短提示信息进行配置:

tox-quickstart

后续运行tox 命令,可执行自动化脚本测试:

tox

tox --verbose
tox --verbose --parallel all
tox --verbose --parallel auto
tox --verbose --parallel 4  // 4 cpu core
tox --verbose --parallel 8  // 8 cpu core

python2 -m tox --result-json ./Temp/help/python2_tox_result_json.txt
python3 -m tox --result-json ./Temp/help/python3_tox_result_json.txt

5.3.2 build

可使用如下命令, 进行xxx.tar.gz 源码包和xxx.whl 二进制包构建, 命令如下:

# python build tar.gz and whl
python2 -m build

# python build tar.gz
python2 -m build --sdist
# python build whl
python2 -m build --wheel


# python build tar.gz and whl
python3 -m build

# python build tar.gz
python3 -m build --sdist
# python build whl
python3 -m build --wheel

5.3 发布

5.3.1 注册账号

  1. 账户注册地址: https://pypi.org/account/register/
  2. 创建一个PyPI API令牌, 以便能够安全地上传您的项目;
  3. 为了避免每次上载时都必须复制和粘贴令牌,可以创建一个$HOME/.pypirc 文件, 参考如下:
[pypi]
username = __token__
password = <the token value, including the `pypi-` prefix>

5.3.2 检查软件包

检查软件包, 命令:

twine check dist/*

5.3.3 上传软件包

上传软件包, 命令:

twine upload dist/*

六. WiKi

6.1 规约与守则

  1. 【Contract: 规约守则】

6.2 文档与源码

  1. 【Document: Python 环境查看函数】
  2. 【Source: Recommended Source Websites】

6.3 配置与模板

  1. 【Config: The LICENSE File】
  2. 【Config: The MANIFEST File】
  3. 【Config: The pyproject File】
  4. 【Config: The requirements File】
  5. 【Config: The setup File】
  6. 【Config: The tox File】
  7. 【Template: The __init__ File】
  8. 【Template: The __init__with_pkgutil File】
  9. 【Template: The template File】
  10. 【Template: The template_class File】
  11. 【Template: The test_template File】

6.4 调试与构建

  1. 【Debug: Bash_or_Ps1】
  2. 【Debug: Python Command】
  3. 【Debug: Environment Variable Information(The Necessities)】
  4. 【Debug: Environment Variable Information(An Generals)】
  5. 【Build: The Requirements Text】
  6. 【Build: The Setup Script】

6.5 日志与清理

  1. 【Clean: darwin】
  2. 【Clean: win】

七. 参考

  1. https://packaging.python.org/tutorials/packaging-projects/
  2. https://packaging.python.org/guides/distributing-packages-using-setuptools/
  3. https://pypi.org/pypi?%3Aaction=list_classifiers
  4. https://docs.python.org/2/distutils/setupscript.html#additional-meta-data