python3 pip loading egg is deprecated 警告的解决方法

本文最后更新于 2024年2月4日 凌晨

解决 egg is deprecation 警告

python3 -m pip install some_package 时发现 exploitable 有警告:

DEPRECATION: Loading egg at exploitable-1.32-py3.12.egg is deprecated. pip 24.3 will enforce this behaviour change. A possible replacement is to use pip for package installation.
Discussion can be found at https://github.com/pypa/pip/issues/12330

pip 24.3 将废弃 egg 形式的 python package, 根据 github issue [1] 的信息 pip 24.3 将在 October 2024 发布。可以使用下面的方法,要去掉上面的警告信息。


cd exploitable_src_dir

# 删除老的 build 结果
rm -rf build dist htmlcov *.egg-info

# 升级 pip
python3 -m pip install --upgrade build

# 重新 build
python3 -m build --wheel

# 使用 wheel 的方式安装
python3 -m pip install . --user

一般情况下,不用重新写 pyproject.toml ,执行上面命令就可以了。

在 Wheel 中添加二进制文件的方法

根据python 官方的文档,MANIFEST.in 只对 source distributions (sdist) 起作用。

MANIFEST.in does not affect binary distributions such as wheels.

要想给 wheel 添加非纯 python 的文件,有一些困难,主要是一些使用 Extension 的 Python Package 会遇上这个问题。通过研究发现,可以控制 setup.py bdist_wheel 的参数达到打包so 文件的效果。

执行 python3 setup.py bdist_wheel --help ,可以看到详细的参数。

Options for 'bdist_wheel' command:
  --bdist-dir (-b)  temporary directory for creating the distribution
  --plat-name (-p)  platform name to embed in generated filenames (default:
                    linux_x86_64)
  --keep-temp (-k)  keep the pseudo-installation tree around after creating
                    the distribution archive
  --dist-dir (-d)   directory to put final built distributions in
  --skip-build      skip rebuilding everything (for testing/debugging)
  --relative        build the archive using relative paths (default: false)
  --owner (-u)      Owner name used when creating a tar file [default: current
                    user]
  --group (-g)      Group name used when creating a tar file [default: current
                    group]
  --universal       make a universal wheel (default: false)
  --compression     zipfile compression (one of: stored, deflated) (default:
                    'deflated')
  --python-tag      Python implementation compatibility tag (default: 'py3')
  --build-number    Build number for this particular version. As specified in
                    PEP-0427, this must start with a digit. [default: None]
  --py-limited-api  Python tag (cp32|cp33|cpNN) for abi3 wheel tag (default:
                    false)

利用--bdist-dir 参数,修改生成wheel distributions 的目录可以达到目的。

from setuptools import setup, Extension, find_packages

lib_name = Extension()
setup(name='package_name',
      packages=find_packages(),
      package_data={'': ['*.so']},
      include_package_data=True,
      ...,
      ext_modules=[lib_name],
      options={
          'bdist_wheel': {'python_tag': 'cp30', 'py_limited_api': 'cp32', 'bdist_dir': 'build'},
          'build_ext': {'build_lib': 'build/package_name'},
      }
)

修改 setup.py 后,重新执行 python3 -m build --wheel 即可。

参考信息

[1] Remove support for installed .egg distributions
[2] Packaging Python Projects
[3] Writing the Setup Script
[4] Packaging and distributing projects
[5] wheel Documentation


python3 pip loading egg is deprecated 警告的解决方法
https://usmacd.com/cn/egg-is-deprecated/
作者
henices
发布于
2024年1月17日
许可协议