Python 如何根据PEP 517构建C扩展,即使用pyproject.toml而不是setup.py?
我想为CPython构建一个C扩展。传统上,我可以使用Python 如何根据PEP 517构建C扩展,即使用pyproject.toml而不是setup.py?,python,setuptools,setup.py,python-packaging,pyproject.toml,Python,Setuptools,Setup.py,Python Packaging,Pyproject.toml,我想为CPython构建一个C扩展。传统上,我可以使用setup.py文件来完成。然而,出于PEP517中提到的原因,我更喜欢使用pyproject.toml的声明性方法。我知道setuptools是唯一可以在所有相关平台上构建C扩展的构建后端。事实上,我不知道有任何后端能够与过时的distutils一起构建C扩展 在此背景下,常见的setup.py如下所示: 从设置工具导入设置,扩展 kwargs=dict( name='mypackage', #更多元数据 外部模块=[ 扩展名('mypac
setup.py
文件来完成。然而,出于PEP517中提到的原因,我更喜欢使用pyproject.toml
的声明性方法。我知道setuptools
是唯一可以在所有相关平台上构建C扩展的构建后端。事实上,我不知道有任何后端能够与过时的distutils
一起构建C扩展
在此背景下,常见的setup.py
如下所示:
从设置工具导入设置,扩展
kwargs=dict(
name='mypackage',
#更多元数据
外部模块=[
扩展名('mypackage.mymodule',['lib/mymodule.c',
“lib/mypackage.c”,
'lib/myalloc.c'],
include_dirs=['lib'],
py_limited(api=True)])
设置(**kwargs)
现在,挑战是将上述内容放入pyproject.toml
和setup.cfg
中
setuptools
文档建议使用pyproject.toml
如下:
[构建系统]
需要=[
“设置工具>=52.0”,
'车轮>=0.36']
build backend=“setuptools.build\u meta”
看
- 及
此外,实际的元数据应该进入
setup.cfg
。但是,我还没有找到任何关于如何将ext\u模块
kwarg,特别是Extension()
调用转换为setup.cfg
语法的解释。pyproject.toml
并不是严格意义上的用来替换setup.py
,而是在仍然需要时确保其正确执行(请参阅和):
如果存在build backend
键,则该键优先,并且源代码树遵循指定后端的格式和约定(因此,除非后端需要setup.py
),否则不需要。项目可能仍然希望包含一个setup.py
,以便与不使用此规范的工具兼容
setuptools
尝试将脚本中的所有内容移动到配置文件中时:
元数据有两种类型:静态和动态
- 静态元数据(
):保证每次都相同。这更简单,更易于阅读,并避免了许多常见错误,如编码错误setup.cfg
- 动态元数据(
):可能不确定。安装时动态或确定的任何项目,以及扩展模块setup.py
setuptools
的扩展,都需要进入setup.py
应首选静态元数据,而动态元数据仅在绝对必要时用作转义图案填充
事实上,现在只可能使用2年,而且无论如何setuptools
话虽如此,如果您希望尽可能地坚持静态方式,您可以将所有内容移动到
setup.cfg
文件中,并将其余内容保留在setup.py
中:
setup.cfg
[元数据]
name=mypackage
; 更多元数据
setup.py
从设置工具导入设置,扩展
设置参数=dict(
外部模块=[
延伸(
“mypackage.mymodule”,
['lib/mymodule.c','lib/mypackage.c','lib/myalloc.c'],
include_dirs=['lib'],
py_limited_api=True
)
]
)
设置(**设置参数)
但是我会把所有的东西都放进
setup.py
那么什么是阻塞呢?你目前的状况如何?有错误消息吗?我的状态是:由于缺少有关如何在setup.cfg文件中声明C扩展名的文档而被阻止。我考虑了一个[build_ext]部分,但也没有找到任何文档。因此,我想我离尝试构建还有几步之遥。看起来它不受支持(目前):