代码之家  ›  专栏  ›  技术社区  ›  shadowtalker

获取setup.py-sdist、bdist_wheel等将生成的文件的名称

  •  0
  • shadowtalker  · 技术社区  · 2 年前

    在运行安装脚本之前,有没有一种简单的方法可以知道Python轮子的文件名?

    我试图生成一个Bazel规则,为机器中安装的每个Python版本构建一个.whl,该库包含本地代码,因此需要分别为每个版本编译。Bazel的问题是,它需要提前声明任何输出,我观察到的是,每个Python版本都会生成不同的文件名,但没有明显的一致性(malloc和unicode的前缀不同)

    2.7  --> lib-0.0.0-cp27-cp27mu-linux_x86_64.whl
    3.6m --> lib-0.0.0-cp36-cp36m-linux_x86_64.whl
    3.8  --> lib-0.0.0-cp36-cp38-linux_x86_64.whl
    

    我知道作为一种变通方法,我可以拉上轮子的拉链把它传来传去,但我想知道是否有更清洁的方法。

    0 回复  |  直到 4 年前
        1
  •  4
  •   hoefling    4 年前

    使现代化

    另请参阅更详细的答案 here

    您可以通过查询 bdist_wheel 命令,为此您甚至不需要构建任何东西或编写 setup.py 脚本(但您需要传递给的元数据 setup 功能)。示例:

    from distutils.core import Extension
    from setuptools.dist import Distribution
    
    
    fuzzlib = Extension('fuzzlib', ['fuzz.pyx'])  # the files don't need to exist
    dist = Distribution(attrs={'name': 'so', 'version': '0.1.2', 'ext_modules': [fuzzlib]})
    bdist_wheel_cmd = dist.get_command_obj('bdist_wheel')
    bdist_wheel_cmd.ensure_finalized()
    
    distname = bdist_wheel_cmd.wheel_dist_name
    tag = '-'.join(bdist_wheel_cmd.get_tag())
    wheel_name = f'{distname}-{tag}.whl'
    print(wheel_name)
    

    将为您打印所需的姓名。请注意 attrs 传递给 Distribution 应包含传递给的相同元数据 设置 函数,否则可能会得到错误的标记。要重用元数据,请在 setup.py 脚本这可以像例如。

    setup_kwargs = {'name': 'so', 'version': '0.1.2', ...}
    
    dist = Distribution(attrs=setup_kwargs)
    ...
    setup(**setup_kwargs)