from pack.mod import f
如何从对象f获取有关导入的信息 - 'pack.mod'
我可以使用f.__module__
来获取它
但如果函数def在模块中我获得此属性(f.__module__
),则返回'__main__'
。但我需要真正的道路 - 'pack.mod'
我找到了这种方式来获取这些信息:
inspect.getmodule(f).__file__
然后我可以从sys.path
子路径开始路径,替换/
上的.
并获取路径 - 'pack.mod'
但是可能存在一些更方便的方式吗?
答案 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__
运行)确定“from
或import
语句可以使用不同的主脚本从内部导入此函数我吗?”。
问题是,问题是不适合的,因为可能没有任何这样的路径可用于此目的(没有什么能保证当前主脚本的路径在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__