我正在开发一个插件架构,需要将类似“foo.bar”的包名称转换为代码所在的绝对路径。 imp.find_module似乎做我想要的,除非有问题的代码是通过egg-link安装的(通过'pip install develop'安装)。
如果有两个模块foo.bar和foo.bar2通过egg-links安装(并且位于完全独立的文件系统位置,如/ home / bob / foo / bar和/ home / alice / foo / bar2 ),find_modules不起作用,因为我查找包“foo”并获取foo / bar的位置,但不是foo / bar2。
任何人都有替代功能的建议吗? find_modules不接受分层名称,因此我不能只将“foo.bar2”传递给它。
答案 0 :(得分: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__))