如何使用构建工具创建特定于平台的Python轮子



build(https://github.com/pypa/build)是制造轮子的好工具。然而,我找不到一种方法来创建我可以使用python setup.py --plat-name=linux_x86_64进行的特定于平台的轮子。

我尝试过这些方法:

  • 添加setup.cfg[bdist_wheel] plat-name=linux_x86_64内容。它工作得很好,但我想让它动态(在Windows上,我想使用win_amd64(
  • 我试过python -m build -w -n "--config-setting=--plat-name(=linux_x86_64)",没有成功

重命名创建的.whl文件感觉是一个棘手的解决方案。

解决这一问题的最先进的方法是什么?

尽管我多次尝试使用--config-setting设置plat-name,但都没有成功。

但是,我找不到一种方法来创建可以使用python setup.py --plat-name=linux_x86_64的特定于平台的轮子。

您可以读取setup.py中的--plat-name选项并覆盖bdist_wheel

from setuptools import setup
from wheel.bdist_wheel import bdist_wheel
def get_plat_name():
"""Parses value of the --plat-name from the program arguments."""
class wheel(bdist_wheel):
def finalize_options(self):
super().finalize_options()
self.plat_name = get_plat_name()
setup(cmdclass={"bdist_wheel": wheel})

使用bdist_wheelsetuptools命令

我应用的解决方案非常简单。以下是setup.py的相关部分。

from wheel.bdist_wheel import bdist_wheel
class BDistWheel(bdist_wheel):
def get_tag(self) -> List[str]:
return (self.python_tag, "none", "linux")

cmdclass = {
"bdist_wheel": BDistWheel,
}
setup(
...
cmdclass=cmdclass,
...
)

这将创建一个名为<name>-<version>-py3-none-linux.whl的包。CCD_ 17是从返回的用于CCD_ 18函数的元组生成的。您可以在PEP-427中找到更多信息。

带扩展

构建系统假设,如果Python包是用扩展构建的,那么它是特定于平台的。这实际上是有道理的;纯";Python包通常是独立于平台的。这里有一个过于简单的解决方案来展示构建的扩展如何影响标签:

from setuptools import Extension
from setuptools.command.build_ext import build_ext

class DummyExtension(Extension):
def __init__(self):
super().__init__("dummy.extension", sources=[])
class DummyExtensionBuild(build_ext):
def run(self) -> None:
return
cmdclass = {
"build_ext": DummyExtensionBuild,
}
setup(
...
cmdclass=cmdclass,
...
)

这将创建一个非常特定的轮子:<name>-<version>-cp38-cp38-linux_x86_64.whl

当然,您也可以通过应用第一种方法来覆盖标记。

不需要创建自定义命令类。显式提供plat_name的语法如下:

from setuptools import setup
def get_platname():
# do whatever you need here
return "potato"
setup(
name="myproj",
version="0.1",
options={
"bdist_wheel": {
"plat_name": get_platname(),
},
},    
)

使用纯pyproject.toml设置,可以通过以下方式设置平台:

python -m build -w -C="--global-option=--plat-name" -C="--global-option=anything_you_like_here"

感谢@sinoroc在上面的评论中分享了这个链接:https://github.com/pypa/build/issues/202

相关内容

最新更新