首页 > 系统相关 >解决pypi上传轮子unsupported platform tag 'linux_x86_64'问题

解决pypi上传轮子unsupported platform tag 'linux_x86_64'问题

时间:2024-08-13 10:16:17浏览次数:19  
标签:12 dist x86 08 xxx pypi 2024 platform data

问题背景

在上传某轮子时出现了这样的一个报错:

$ twine upload --repository-url https://upload.pypi.org/legacy/ dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Enter your username: __token__
Uploading xxx-1.0-cp37-cp37m-linux_x86_64.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 347.0/347.0 kB • 00:00 • 6.2 MB/s
WARNING  Error during upload. Retry with the --verbose option for more details.   
ERROR    HTTPError: 400 Bad Request from https://upload.pypi.org/legacy/          
         Binary wheel 'xxx-1.0-cp37-cp37m-linux_x86_64.whl' has an unsupported  
         platform tag 'linux_x86_64'. 

遂发现当前的pypi对于轮子中含有C/C++等代码的库要求不同于纯Python的代码,需要经过many_linux平台的测试验证才能发布。

解决方案

经过一番检索,解决该问题的流程大致为:

  1. 选择一个合适的manylinux docker镜像,例如我这里代码中包含了CUDA,因此选择使用pytorch/manylinux-cuda111这个镜像;
  2. 基于docker镜像构建一个开发环境,然后用其中包含的几个不同版本的Python对代码进行构建,例如/opt/_internal/cpython-3.7.5/bin/python3 setup.py sdist bdist_wheel --universal,这样就会在dist目录下生成一个whl包;
  3. 使用auditwheel对前面生成的whl包进行修复:/opt/_internal/cpython-3.7.5/bin/python3 -m auditwheel repair dist/xxx-*-cp37-cp37m-linux_x86_64.whl --plat manylinux2014_x86_64 -w fix-dist/,以固化动态链接库(如有),最终会在fix-dist/路径下得到一个可以发布的轮子。

setup.py关于data_files的配置

有一些动态构建的动态链接库,直接使用MANIFEST.in或者package_data配置不生效。那么有一种解决的办法是,动态构建完成后,将生成的文件保存到build/路径(Python包构建默认路径)下,然后使用data_files的配置把相关文件包含进来:

data_files=[('xxx', ['build/xxx/libxxx.so',
                        'build/xxx/libxxx.1.so'])]

如果不使用data_files进行包装,仅仅设置packagesinclude_package_data,得到的最终轮子内容是这样的:

$ unzip -l dist/xxx-1.7-cp37-cp37m-linux_x86_64.whl 
Archive:  dist/xxx-1.7-cp37-cp37m-linux_x86_64.whl
  Length      Date    Time    Name
---------  ---------- -----   ----
  1111024  2024-08-12 09:03   xxx.cpython-37m-x86_64-linux-gnu.so
  1100448  2024-08-12 09:03   xxx.cpython-37m-x86_64-linux-gnu.so
     1265  2024-08-12 01:23   xxx/__init__.py
     3012  2024-08-12 06:05   xxx/__main__.py
  1176880  2024-08-12 09:03   xxx/xxx.c
  1181116  2024-08-12 09:03   xxx/xxx.c
        0  2024-08-12 03:15   xxx/kernels/__init__.py
     1063  2024-08-12 09:03   xxx-1.7.dist-info/LICENSE
     2071  2024-08-12 09:03   xxx-1.7.dist-info/METADATA
      104  2024-08-12 09:03   xxx-1.7.dist-info/WHEEL
       26  2024-08-12 09:03   xxx-1.7.dist-info/top_level.txt
      950  2024-08-12 09:04   xxx-1.7.dist-info/RECORD
---------                     -------
  4577959                     12 files

如果加上这个data_files的配置,whl包中会多出这么两个动态链接库:

844648  2024-08-13 02:06   xxx-1.7.data/data/xxx/xxx.1.so
844648  2024-08-13 02:06   xxx-1.7.data/data/xxx/xxx.so

需要注意的是,使用这个轮子pip安装以后,这两个文件存放的地址跟其他文件不一样(跟Python版本有关,这里我们考虑通用情景)。其他文件是存放在对应的site-packages路径下,如/usr/local/python-3.7.5/lib/python3.7/site-packages/xxx/,而data_files一般是存放在Python路径下,如/usr/local/python-3.7.5/xxx/。知道这个信息之后,我们就可以从对应的路径下去索引动态链接库了。

总结概要

对于一个纯Python的项目,从构建到发布是比较容易的。但是如果构建的轮子中含有C代码或者生成的动态链接库,那么构建发布有另外一套规则。我们需要经过manylinux平台的验证,以及动态链接库的固化等过程,还需要当心动态链接库的存放地址等信息。本文主要是提供了一个流程化的思路,具体操作对于不同的项目和平台来说差异是比较大的。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/pypi-manylinux.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

标签:12,dist,x86,08,xxx,pypi,2024,platform,data
From: https://www.cnblogs.com/dechinphy/p/18356251/pypi-manylinux

相关文章

  • 34.x86游戏实战-XXX过检测代码分析
    免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!本次游戏没法给内容参考于:微尘网络安全工具下载:链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3提取码:6tw3复制这段内容后打开百度网盘手机App,操作更方便哦上一个内容:33.x86游戏实战-喊话C......
  • C++虚函数表、地址详解(x86/x64)
    参考博文:c++虚函数表、地址详解-CSDN博客本文在上述博文的基础上,补充了x64下的验证代码。一.什么是虚函数表,它有什么特点?        虚函数大家都知道是基本用于实现多态的,当父类指针指向子类对象的时候,如何确定调用的函数是父类里的还是子类里面的,这就要用到虚函数表......
  • chapter10------32位x86处理器编程架构
    处理器架构处理器架构或者处理器编程架构,是指一整套的硬件架构以及与之相适应的工作状态回顾8086处理器8086处理器有20根地址线,可以寻址1MB内存,但处理器内部的寄存器只有16位,也就是数据线是16根,只能处理16位的数据我们没法用16位的寄存器去访问1MB的内存,简单来说就是无法用16......
  • Docker && Microros && PlatformIO 配置经验留存
    1.背景:无意中看到了小鱼(鱼香ROS)的文章硬件环境:Ubuntu22.04 &&ESP32-WROOM-32想在ESP32WROOM32上实现microros的功能:实现上位机(跑ROS2)通过topic直接控制CAN报文的功能;目前进度:实现了环境的配置(PlatformIO&&docker&&Microros);初步跑通了Microros的订阅与发送(24......
  • 28.x86游戏实战-初探XXX发包
    免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!本次游戏没法给内容参考于:微尘网络安全工具下载:链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3提取码:6tw3复制这段内容后打开百度网盘手机App,操作更方便哦上一个内容:27.x86游戏实战-线程......
  • platformio 添加github的库
    platformio添加github的库在PlatformIO中添加GitHub上的库,你需要在项目的platformio.ini文件中使用库的GitHubURL。以下是添加库的步骤:打开你的PlatformIO项目的platformio.ini文件。在[env:default]部分或者特定的环境部分下,使用lib_deps指令添加GitHub上的库......
  • 如何在GCP机器上安装pypiwin32模块?
    我想在python中导入win32com然后我使用pipinstallpypiwin32pipinstallpywin32python-mpipinstallpypiwin32python-mpipinstallpywin32导入,但是没有成功并收到错误通知Defaultingtouserinstallationbecausenormalsite-pac......
  • Windows下用CMake构建和编译第三方依赖库并向C:\Program Files\或C:\Program Files
    从CMake构建和编译第三方依赖库的步骤:1、下载第三方依赖库的源码,并解压到指定的目录中。2、在第三方依赖库的的源码所在的目录下(一般是src/目录下)创建一个文件夹build。3、打开CMakeGUI软件,按照常规步骤配置和产生针对某种编译器的解决方案文件,比如Visualstudio2019。如下如......
  • STM32开发环境配置记录——关于PlatformIO + VSCode + CubeMX的集成环境配置
    前言​ 为什么配置这样的一个环境呢?鄙人受够了Keil5那个简陋的工作环境了,实在是用不下去,调试上很容易跟CubeMX的代码产生不协调导致调试——发布代码不一致造成的一系列问题。CubeIDE虽说不错,但是它的代码辅助功能和构建系统实在不敢恭维,经常出现Makefile未同步导致符号定义冲突,......
  • 如何向 PyPi 分发类型提示?
    我致力于将Python3.5类型提示添加到响应库中。但是当我测试制作发行版时,sdist或bdist_wheel,它不会安装我的.pyi文件。我可以看到它是发行版的一部分,但它并没有比这更进一步。您可以在此处查看我在我的存储库中获得的内容:https://github.c......