为何`importlib.metadata.version`无法在ZIP文件上正常工作?
解决importlib.metadata无法识别ZIP中dist-info的问题
问题原因
你的打包方式和PYTHONPATH设置有误,导致importlib.metadata无法在ZIP文件的正确位置找到包的元数据目录(dist-info)。
当执行pip install -t foo jedi-language-server后,foo目录下直接包含包代码和对应的dist-info元数据目录。但你用zip -r foo.zip foo打包时,会把整个foo目录作为ZIP的根目录,导致元数据目录处于foo.zip/foo/路径下。而设置PYTHONPATH=foo.zip/foo后,importlib.metadata只会在sys.path指定的路径根目录下搜索dist-info,不会递归查找ZIP内部的子目录,因此报错。
修复步骤
调整打包方式和PYTHONPATH设置即可解决:
- 保持原安装步骤:
pip install -t foo jedi-language-server - 进入
foo目录,将目录内的所有内容直接打包(而非打包整个foo目录):cd foo zip -r ../foo.zip * - 将打包好的
foo.zip直接加入PYTHONPATH,执行验证命令:PYTHONPATH=../foo.zip python -c "from importlib.metadata import version; version('jedi-language-server')"
另一种调整方式(不修改打包方式)
如果你不想改变打包方式,也可以修改PYTHONPATH为ZIP文件本身,然后指定包的完整路径:
PYTHONPATH=foo.zip python -c "from importlib.metadata import version; version('foo.jedi-language-server')"
不过更推荐第一种方法,保持包结构与直接安装时一致,无需调整代码逻辑。
内容的提问来源于stack exchange,提问作者DrownedSuccess
相关产品推荐
相关产品推荐

