使用micropip向Pyodide安装.whl包时提示'非zip文件'错误求助
在Pyodide中使用micropip安装自定义.whl包时触发「不是zip文件」错误
问题描述
我尝试在HTML文件中借助micropip将自定义.whl包导入Pyodide使用,却收到「File is not a zip file」错误提示。根据micropip官方文档,micropip.install()应该支持.whl文件,我已经用python3 -m build命令生成了.whl文件并上传至GitHub。
报错详情
pyodide.asm.js:14 Uncaught (in promise) PythonError: Traceback (most recent call last): File "/lib/python3.10/asyncio/futures.py", line 201, in result raise self._exception File "/lib/python3.10/asyncio/tasks.py", line 234, in __step result = coro.throw(exc) File "/lib/python3.10/site-packages/micropip/_micropip.py", line 183, in install transaction = await self.gather_requirements(requirements, ctx, keep_going) File "/lib/python3.10/site-packages/micropip/_micropip.py", line 173, in gather_requirements await gather(*requirement_promises) File "/lib/python3.10/asyncio/futures.py", line 284, in __await__ yield self # This tells Task to wait for completion. File "/lib/python3.10/asyncio/tasks.py", line 304, in __wakeup future.result() File "/lib/python3.10/asyncio/futures.py", line 201, in result raise self._exception File "/lib/python3.10/asyncio/tasks.py", line 232, in __step result = coro.send(None) File "/lib/python3.10/site-packages/micropip/_micropip.py", line 245, in add_requirement await self.add_wheel(name, wheel, version, (), ctx, transaction) File "/lib/python3.10/site-packages/micropip/_micropip.py", line 313, in add_wheel with ZipFile(io.BytesIO(wheel_bytes)) as zip_file: File "/lib/python3.10/zipfile.py", line 1258, in __init__ self._RealGetContents() File "/lib/python3.10/zipfile.py", line 1325, in _RealGetContents raise BadZipFile("File is not a zip file") zipfile.BadZipFile: File is not a zip file
代码示例
<!DOCTYPE html> <p>My first Pyodide app</p> <script type="text/javascript"> async function main() { let pyodide = await loadPyodide(); await pyodide.loadPackage("micropip"); const micropip = pyodide.pyimport("micropip"); await micropip.install("url of .whl file"); await pyodide.runPython(` import <package-name> `); } main(); </script>
解决办法
- 修正GitHub下载链接:不要使用GitHub仓库的文件浏览链接,这类链接返回的是HTML页面而非实际的.whl文件。改用GitHub文件的Raw链接,或者将.whl包上传到GitHub Releases获取直接下载地址。
- 验证whl包完整性:本地执行
unzip -t <your-package>.whl检查包是否为有效zip文件。如果验证失败,重新运行python3 -m build生成包,确保过程无报错。 - 检查Pyodide兼容性:确保你的包是纯Python包,或者已经针对Pyodide的
emscripten架构编译成兼容的wasm格式whl包。包含C扩展的普通whl包无法在Pyodide中运行。 - 确认CORS配置:如果whl包托管在第三方服务器,需确保服务器配置了CORS,允许你的HTML页面所在域名访问该资源,避免下载内容被拦截或不完整。
内容的提问来源于stack exchange,提问作者teles
相关产品推荐
相关产品推荐

