setup.py
文件的概念,并通过python setup.py
命令触发。找到这个包
下载源发行版并提取它
在提取的文件夹上运行python setup.py install
(进行构建+安装)
python setup.py sdist
生成分发包,运行python setup.py upload
上传到中央存储仓(上传命令在 2013 年被弃用了,因为有 twine【3】工具,更主要是因为 upload 使用了不安全的 HTTP 连接,而且上传命令会做一次新的构建,也就不允许最终用户在实际上传之前检测(inspect)生成的包)。python setup.py install
时,它使用 Python 解释器来安装包。因此,构建操作可以访问该解释器中已经存在的所有三方包。最值得注意的是,它完全使用了安装在主机 Python 解释器上的 setuptools 版本。如果一个包使用了 setuptools 的新版本特性,那么完成安装的唯一方法就是首先更新已安装的 setuptools。File "setup_build.py", line 99, in run
from Cython.Build import cythonize
ImportError: No module named Cython.Build
python setup.py install
现在可以:创建一个临时文件夹
创建一个隔离的(从三方库的 site packages 中)Python 环境 python -m virtualenv our_build_env
,让我们将这个 Python 可执行文件称为python_isolated
安装构建的依赖项
通过python_isolated setup.py bdist_wheel
,生成一个用于安装的 wheel
提取 wheel 到 Python 的 site packages 文件夹
cython
的包,但不必在运行的 Python 环境中实际安装cython
。指定构建依赖项的文件与方法的是pyproject.toml
元数据文件:[build-system]
requires = [
"setuptools >= 40.8.0",
"wheel >= 0.30.0",
"cython >= 0.29.4",
]
pip wheel . --no-deps
命令时,该命令会自动在后台创建一个包含构建依赖项的独立 Python,然后在该环境中调用python setup.py bdist_wheel
或python setup.py sdist
命令。setup.py
。整个生态系统仍然构建在 distutils 和 setuptools 的接口基础之上,由于试图保持向后兼容性,没法作太大的变更。理想情况下,默认选项应该是一个声明式的(declarative)构建配置,适用于 99% 的情况,再提供一个退回到命令式系统的选项,供真正需要灵活性时使用。在这情况下,如果你发现还需要选择用命令式的构建,那么我们可以认为出现了坏味道代码。
setup.py
的最大的问题是大多数人是声明式地使用它,所以当他们用命令式时,往往会将 bug 引入到构建系统。一个这样的例子:如果你有一个 Python2.7 的依赖项,你可能会试图有条件地在 setup.py 中指定 sys.version,但 sys.version 仅指的是执行构建的解释器;相反,你应该对需求项使用声明式的环境标记…
setup.cfg
接口来起带头作用,当一个 PEP-517 系统就位时,在大多数情况下,你应该选择它而不是使用 setup.py。build-backend
键值:[build-system]
requires = ["flit"]
build-backend = "flit.api:main"
import flit.api
backend = flit.api.main
# build wheel via
backend.build_wheel()
# build source distribution via
backend.build_sdist()
flit.buildapi
实现setuptools.build_meta
(后面会解释原因)poetry.masonry.api
实现pyproject.toml
,写了适当的requires
和build-backend
,你需要启用tox.ini
中的isolated_build
标志:[tox]
isolated_build = True
python setup.py sdist
命令。