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

问题背景

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

$ 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.whlLength      Date    Time    Name
---------  ---------- -----   ----1111024  2024-08-12 09:03   xxx.cpython-37m-x86_64-linux-gnu.so1100448  2024-08-12 09:03   xxx.cpython-37m-x86_64-linux-gnu.so1265  2024-08-12 01:23   xxx/__init__.py3012  2024-08-12 06:05   xxx/__main__.py1176880  2024-08-12 09:03   xxx/xxx.c1181116  2024-08-12 09:03   xxx/xxx.c0  2024-08-12 03:15   xxx/kernels/__init__.py1063  2024-08-12 09:03   xxx-1.7.dist-info/LICENSE2071  2024-08-12 09:03   xxx-1.7.dist-info/METADATA104  2024-08-12 09:03   xxx-1.7.dist-info/WHEEL26  2024-08-12 09:03   xxx-1.7.dist-info/top_level.txt950  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/783158.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择合适的在线文档管理工具?

国内外主流的10款在线文档管理软件对比:PingCode、Worktile、腾讯文档、石墨文档、语雀、Egnyte、Zoho Office Suite、Microsoft SharePoint、ONLYOFFICE DocSpace、DocuWare Cloud。在当今的数字化办公环境中,有效管理和分享文档变得至关重要,但找到一个既能满足功能需求又…

【深度分析】关于SPN不正确导致SQL数据库连接失败

连接SQL Server数据库时发生报错“The target principal name is incorrect. Cannot generate SSPI context”,无法连接,可能是由于AD域中记录了错误的SPN,导致无法进行身份验证而连接失败。下文通过简述Kerberos认证过程、SPN的组成,引出由SPN错误引发报错的解决方法。 Ke…

可持久化可反悔贪心

接到上级通知,贪心思路假了,紧急需要调整思路 思路假了?考虑反悔 while(思路==false){cout<<"思路假了"<<endl;思路=true;cout<<"改对了"<<endl; }Sample Output 思路假了 改对了 思路假了 改对了 思路假了 改对了 思路假了 改…

使用 navigateTo 实现灵活的路由导航

title: 使用 navigateTo 实现灵活的路由导航 date: 2024/8/13 updated: 2024/8/13 author: cmdragon excerpt: 摘要:本文详细介绍 Nuxt.js 中的 navigateTo 函数,包括基本用法、在路由中间件中使用、导航到外部 URL 和新标签页打开链接的方法,以及参数详解和注意事项,展示…

神经网络之卷积篇:详解Padding

详解Padding 为了构建深度神经网络,需要学会使用的一个基本的卷积操作就是padding,让来看看它是如何工作的。如果用一个33的过滤器卷积一个66的图像,最后会得到一个44的输出,也就是一个44矩阵。那是因为33过滤器在66矩阵中,只可能有44种可能的位置。这背后的数学解释是,如…

ChatMoneyAI嘴替,高情商回复

本文由 ChatMoney团队出品会说话是一个人的优势,而会接话才是一个人的本事。现实中很多人有这样的困扰:朋友聚会、上门拜访以及和人聊天。是不是完全不知道如何回应,只会说“嗯”、“对”、“好”。这种回应方式,会让人没有和你聊下去的欲望,也容易把天聊死,从而错失大把…

ChatMoney智能体高情商接话神器

本文由 ChatMoney团队出品会说话是一个人的优势,而会接话才是一个人的本事。现实中很多人有这样的困扰:朋友聚会、上门拜访以及和人聊天。是不是完全不知道如何回应,只会说“嗯”、“对”、“好”。这种回应方式,会让人没有和你聊下去的欲望,也容易把天聊死,从而错失大把…

MySQL时区设置和查看

检查: 操作系统的时区 MYSQL的时区中国标准时间(CST) 在修改系统时间之后,重新启动MySQL服务器,以确保修改生效。mysql 时区查看‌MySQL时区设置查看全局和会话时区使用命令 SELECT @@global.time_zone, @@session.time_zone; 可以查看全局和会话的时区设置。 使用命令 SH…

vue3的defineAsyncComponent是如何实现异步组件的呢?

这篇文章我们将通过debug源码的方式来带你搞清楚defineAsyncComponent是如何实现异步组件的前言 在上一篇 给我5分钟,保证教会你在vue3中动态加载远程组件文章中,我们通过defineAsyncComponent实现了动态加载远程组件。这篇文章我们将通过debug源码的方式来带你搞清楚defineA…

从自建到云原生:数据管理的未来与变革

在数据技术不断演进的背景下,云数据库的崛起和云原生数据库的普及标志着数据库技术的显著变革。从最初的自建数据库模式到如今的云原生数据库,企业在数据管理上的选择变得更加丰富和灵活。云数据库不仅仅是对传统数据库技术的一个迁移,更是对其进行了一次全面的升级和优化。…