假设我们要用xyz
导入一些名为datetime
的第三方软件包或模块(不是像import xyz
那样的“内置”)。 xyz
的PyPI名称通常是相同的,因此在xyz
中将显示为pip list
。但是,据我所知,没有规则说必须如此。例如,google-pasta的模块名为pasta
。
给出我正在import
的模块或包的名称,是否有办法确定它来自哪个PyPI包(除了猜测PyPI包并查看源代码之外)?相反,有没有办法知道给定的PyPI安装将哪些软件包和模块引入了名称空间?
我相信类似以下的内容应该起作用:
#!/usr/bin/env python3
import importlib.util
import pathlib
import importlib_metadata
def get_distribution(file_name):
result = None
for distribution in importlib_metadata.distributions():
try:
relative = (
pathlib.Path(file_name)
.relative_to(distribution.locate_file(''))
)
except ValueError:
pass
else:
if relative in distribution.files:
result = distribution
return result
def alpha():
file_name = importlib.util.find_spec('easy_install').origin
distribution = get_distribution(file_name)
print("alpha", distribution.metadata['Name'])
def bravo():
file_name = importlib_metadata.__file__
distribution = get_distribution(file_name)
print("bravo", distribution.metadata['Name'])
if __name__ == '__main__':
alpha()
bravo()