获取功能导入路径

时间:2010-03-10 18:17:51

标签: python function import path

from pack.mod import f

如何从对象f获取有关导入的信息 - 'pack.mod'

我可以使用f.__module__来获取它 但如果函数def在模块中我获得此属性(f.__module__),则返回'__main__'。但我需要真正的道路 - 'pack.mod'

我找到了这种方式来获取这些信息:

inspect.getmodule(f).__file__

然后我可以从sys.path子路径开始路径,替换/上的.并获取路径 - 'pack.mod' 但是可能存在一些更方便的方式吗?

2 个答案:

答案 0 :(得分:17)

内部inspect.getmodule(f)每个inspect.py's sources的内容基本上是sys.modules.get(object.__module__) - 我不会直接使用该代码调用“更方便”(超出“基本上”部分) ,inspect对角落案件有很多有用的捕捉和纠正方法。)

为什么不直接致电inspect.getsourcefile(f)

编辑:在线条之间读取OP似乎正在尝试做类似的事情

python /foo/bar/baz/bla.py

并且在bla.py内(因此以__main__运行)确定“fromimport语句可以使用不同的主脚本从内部导入此函数我吗?”。

问题是,问题是不适合的,因为可能没有任何这样的路径可用于此目的(没有什么能保证当前主脚本的路径在sys.path上时不同主脚本稍后运行),可能有几个不同的(例如,/foo/bar/foo/bar/baz可能在sys.path上,/foo/bar/baz/__init__.py存在,在这种情况下{{1}并且from baz.bla import f可能都有效,并且没有任何保证某些其他,之前的from bla import f项可能不会“抢占”导入尝试(例如,说sys.path/foo/bar/baz上,但在它之前还有sys.path,并且还存在完全不相关的文件/fee/fie/foo - 等等。)

无论这种发现尝试的目的是什么,我建议找一个替代架构 - 例如,/fee/fie/foo/bla.py 实际执行的架构(正如OP在开头所说的那样)问题),以便from baz.bla import f正确设置为f.__module__

答案 1 :(得分:6)

您需要__name__的{​​{1}}属性:

__module__