获取 python3 给定源目录的包元数据而不安装

Get python3 package metadata given source directory without installing

我正在尝试获取一些包元数据(名称、版本),给定源目录路径而不安装所述包。

这些有效,如果您位于根目录中,则使用 setup.py

> python3 setup.py --name
my_package_name

> python3 setup.py --version
0.1.0

但是,我被警告不要使用 python3 setup.py 命令——并且确实看到了警告:

.../lib/python3.7/site-packages/setuptools/installer.py:30: SetuptoolsDeprecationWarning: setuptools.installer is deprecated. Requirements should be satisfied by a PEP 517 installer.
  SetuptoolsDeprecationWarning,

我知道 pip show my_package_name 将打印有关包的各种元数据(包括 name/version),但是它需要将包安装到环境中。它也不采用源目录,因此需要我已经知道我想要的信息包的名称。

> pip show .
WARNING: Package(s) not found: .

> pip show my_package_name
WARNING: Package(s) not found: my_package_name

> pip install .
...

> pip show my_package_name
Name: my_package_name
Version: 0.1.0
...
...

是否有任何等效的 pip 命令(或其他工具)可以在不实际安装包的情况下向我显示给定源目录的包版本?

提前致谢!

它不像 setup.py 调用那么紧凑,但您可以使用 pep517 包。

python -m pep517.meta my-package 将创建一个 my-package/dist/my_package.dist-info/METADATA 文件,您可以在其中阅读所有可用信息。

pip 供应商提供此 PyPA 库,因此 python -m pip._vendor.pep517.meta my-package 无需额外安装即可工作。

警告

这仅在 PEP-517 构建后端实现了 prepare_metadata_for_build_wheel 挂钩时才有效,根据 https://peps.python.org/pep-0517/#prepare-metadata-for-build-wheel

这是可选的

让我们看看是否有人想出更好的工具。


如果您曾经 运行 在一个使用缺少 setup.py 文件的 setuptools.build_meta 后端的纯 PEP-517 项目上,您仍然可以创建一个“空”项目(使用以下内容)

from setuptools import setup
setup()

并继续使用 python setup.py 说明。

但这不适用于其他 PEP-517 构建后端,如 poetry 或 flit。

您可以将 pip -v install--global-option="--version". According to the docs 一起使用,这将按以下方式翻译:

python -m pip -v install --global-option="--version" path/to/project

相当于

python setup.py --version install

后一个命令只运行 --version 部分然后退出,从而忽略 install 部分。由于相应的子进程成功终止,pip 将报告它已经安装了包,而实际上并没有。无论如何,从底部开始的第三行将包含 setup.py 调用的输出,即版本号:

Processing ./path/to/project
  Running command python setup.py egg_info
  running egg_info
  [...]
  Preparing metadata (setup.py) ... done
Skipping wheel build for testpkg, due to binaries being disabled for it.
Installing collected packages: testpkg
  Running command Running setup.py install for testpkg
  1.2
  Running setup.py install for testpkg ... done
Successfully installed testpkg

注意: 这可能是一个 hacky 解决方案,因为它依赖于 pip -v install 的打印输出,这可能会在未来的版本中发生变化。无论如何,它适用于当前版本的 pip (22.0.4)。