Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据PEP 517构建C扩展,即使用pyproject.toml而不是setup.py?_Python_Setuptools_Setup.py_Python Packaging_Pyproject.toml - Fatal编程技术网

Python 如何根据PEP 517构建C扩展,即使用pyproject.toml而不是setup.py?

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

我想为CPython构建一个C扩展。传统上,我可以使用
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]部分,但也没有找到任何文档。因此,我想我离尝试构建还有几步之遥。看起来它不受支持(目前):