如何找到通过 egg-link 安装的 Python 包的位置?

3 投票
1 回答
1920 浏览
提问于 2025-04-17 07:47

我正在做一个插件架构,需要把像“foo.bar”这样的包名转换成代码所在的绝对路径。imp.find_module这个函数似乎能满足我的需求,但当代码是通过egg-link安装(也就是用'pip install develop'安装)时,它就不管用了。

比如说,如果有两个模块foo.bar和foo.bar2,它们都是通过egg-link安装的,而且它们在文件系统中的位置完全不同,比如一个在/home/bob/foo/bar,另一个在/home/alice/foo/bar2,使用find_modules就不行了。因为我查找“foo”这个包时,只能找到foo/bar的路径,却找不到foo/bar2。

有没有人能推荐一个替代的函数?find_modules不支持层级名称,所以我不能直接把“foo.bar2”传给它。

1 个回答

5

最简单的方法就是直接导入这个模块,然后查看它的 __file__ 属性:

import os
import foo.bar

print(os.path.abspath(foo.bar.__file__))

如果是动态导入的话:

import os
import sys

module_name = 'foo.bar'
__import__(module_name)
print(os.path.abspath(sys.modules[module_name].__file__))

撰写回答