如何找到通过 egg-link 安装的 Python 包的位置?
我正在做一个插件架构,需要把像“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__))