查找 pip 包:pkg_resources 指定自定义目标目录
find pip packages: pkg_resources specify custom target directory
有没有办法为 pkg_resources 指定自定义目标目录以列出 pip 包?我希望能够使用 --target
通过已经使用自定义目标目录的 pkg_resources.require()
找到已安装在自定义目标目录中的软件包。
我不想用的是:
setuptools.find_packages
因为它只使用 sys.path
setuptools.PEP420PackageFinder.find
- 通过遍历目录名称和文件查找包也无济于事,因为我需要一种更通用的方法来查找包名称空间。
感谢任何帮助。
更新
Python 3.8 引入了 importlib.metadata
,一个用于查询已安装软件包的模块,取代了 pkg_resources
。用法示例:
In [1]: from importlib import metadata
In [2]: dists = metadata.distributions(path=['my_target_dir'])
In [3]: list(f"{d.metadata['Name']}=={d.metadata['Version']}" for d in dists)
Out[22]:
['pip==20.0.2',
'ipython==7.13.0',
...
]
对于 Python 2.7 和 Python >=3.5,有一个名为 importlib-metadata
:
的向后移植
$ pip install importlib-metadata
原回答
pkg_resources.find_distributions
函数(记录在 Getting or Creating Distributions 下)接受目标目录以在其中搜索包。示例:
$ ls -l my_target_dir/
total 36
drwxr-xr-x 2 hoefling hoefling 4096 May 17 13:29 __pycache__
-rw-r--r-- 1 hoefling hoefling 126 May 17 13:29 easy_install.py
drwxr-xr-x 5 hoefling hoefling 4096 May 17 13:29 pip
drwxr-xr-x 2 hoefling hoefling 4096 May 17 13:29 pip-10.0.1.dist-info
drwxr-xr-x 5 hoefling hoefling 4096 May 17 13:29 pkg_resources
drwxr-xr-x 6 hoefling hoefling 4096 May 17 13:29 setuptools
drwxr-xr-x 2 hoefling hoefling 4096 May 17 13:29 setuptools-39.1.0.dist-info
drwxr-xr-x 5 hoefling hoefling 4096 May 17 13:29 wheel
drwxr-xr-x 2 hoefling hoefling 4096 May 17 13:29 wheel-0.31.1.dist-info
用 pkg_resources.find_distributions
扫描 my_target_dir
得到:
In [2]: list(pkg_resources.find_distributions('my_target_dir'))
Out[2]:
[wheel 0.31.1 (/data/gentoo64/tmp/so-50380624/my_target_dir),
setuptools 39.1.0 (/data/gentoo64/tmp/so-50380624/my_target_dir),
pip 10.0.1 (/data/gentoo64/tmp/so-50380624/my_target_dir)]
有没有办法为 pkg_resources 指定自定义目标目录以列出 pip 包?我希望能够使用 --target
通过已经使用自定义目标目录的 pkg_resources.require()
找到已安装在自定义目标目录中的软件包。
我不想用的是:
setuptools.find_packages
因为它只使用sys.path
setuptools.PEP420PackageFinder.find
- 通过遍历目录名称和文件查找包也无济于事,因为我需要一种更通用的方法来查找包名称空间。
感谢任何帮助。
更新
Python 3.8 引入了 importlib.metadata
,一个用于查询已安装软件包的模块,取代了 pkg_resources
。用法示例:
In [1]: from importlib import metadata
In [2]: dists = metadata.distributions(path=['my_target_dir'])
In [3]: list(f"{d.metadata['Name']}=={d.metadata['Version']}" for d in dists)
Out[22]:
['pip==20.0.2',
'ipython==7.13.0',
...
]
对于 Python 2.7 和 Python >=3.5,有一个名为 importlib-metadata
:
$ pip install importlib-metadata
原回答
pkg_resources.find_distributions
函数(记录在 Getting or Creating Distributions 下)接受目标目录以在其中搜索包。示例:
$ ls -l my_target_dir/
total 36
drwxr-xr-x 2 hoefling hoefling 4096 May 17 13:29 __pycache__
-rw-r--r-- 1 hoefling hoefling 126 May 17 13:29 easy_install.py
drwxr-xr-x 5 hoefling hoefling 4096 May 17 13:29 pip
drwxr-xr-x 2 hoefling hoefling 4096 May 17 13:29 pip-10.0.1.dist-info
drwxr-xr-x 5 hoefling hoefling 4096 May 17 13:29 pkg_resources
drwxr-xr-x 6 hoefling hoefling 4096 May 17 13:29 setuptools
drwxr-xr-x 2 hoefling hoefling 4096 May 17 13:29 setuptools-39.1.0.dist-info
drwxr-xr-x 5 hoefling hoefling 4096 May 17 13:29 wheel
drwxr-xr-x 2 hoefling hoefling 4096 May 17 13:29 wheel-0.31.1.dist-info
用 pkg_resources.find_distributions
扫描 my_target_dir
得到:
In [2]: list(pkg_resources.find_distributions('my_target_dir'))
Out[2]:
[wheel 0.31.1 (/data/gentoo64/tmp/so-50380624/my_target_dir),
setuptools 39.1.0 (/data/gentoo64/tmp/so-50380624/my_target_dir),
pip 10.0.1 (/data/gentoo64/tmp/so-50380624/my_target_dir)]