就像 @Tosha 回答的那样,pyproject.toml
是你的好朋友。
以下是我项目中使用 jinja2
的一个示例:
setup.py
: # 简化 - 移除了所有实际代码
import jinja2
from setuptools import setup
setup(name='test')
使用命令
python -m build --wheel
进行构建会出现问题:
* Creating venv isolated environment...
* Installing packages in isolated environment... (setuptools >= 40.8.0, wheel)
* Getting dependencies for wheel...
Traceback (most recent call last):
File "/tmp/venv/lib/python3.6/site-packages/pep517/in_process/_in_process.py", line 363, in <module>
main()
File "/tmp/venv/lib/python3.6/site-packages/pep517/in_process/_in_process.py", line 345, in main
json_out['return_val'] = hook(**hook_input['kwargs'])
File "/tmp/venv/lib/python3.6/site-packages/pep517/in_process/_in_process.py", line 130, in get_requires_for_buil
d_wheel
return hook(config_settings)
File "/tmp/build-env-4zi79uth/lib/python3.6/site-packages/setuptools/build_meta.py", line 163, in get_requires_fo
r_build_wheel
config_settings, requirements=['wheel'])
File "/tmp/build-env-4zi79uth/lib/python3.6/site-packages/setuptools/build_meta.py", line 143, in _get_build_requ
ires
self.run_setup()
File "/tmp/build-env-4zi79uth/lib/python3.6/site-packages/setuptools/build_meta.py", line 268, in run_setup
self).run_setup(setup_script=setup_script)
File "/tmp/build-env-4zi79uth/lib/python3.6/site-packages/setuptools/build_meta.py", line 158, in run_setup
exec(compile(code, __file__, 'exec'), locals())
File "setup.py", line 1, in <module>
import jinja2
ModuleNotFoundError: No module named 'jinja2'
ERROR Backend subproccess exited when trying to invoke get_requires_for_build_wheel
然而,添加一个pyproject.toml文件:
[build-system]
requires = [
"setuptools",
"jinja2",
]
修复了这个问题
注意:我也包括setuptools作为要求。忽略它也会导致错误。
setup_requires
是正确的,但是你不能在设置脚本的顶部导入列在setup_requires
中的包。你需要导入什么?如果你导入foo
来组装setup()
函数的输入参数,那么你就没有机会在设置脚本中管理这个依赖关系;否则,覆盖命令应该是答案。请展示你的设置脚本。 - hoefling