evg*_*evg 17 python import function path
from pack.mod import f
Run Code Online (Sandbox Code Playgroud)
如何从对象f获取有关导入的信息 - 'pack.mod'
我可以使用它,f.__module__
但如果函数def在模块中我得到这个属性(f.__module__)它返回'__main__'.但我需要真正的道路 - 'pack.mod'
我找到了这种方式来获取这些信息:
inspect.getmodule(f).__file__
Run Code Online (Sandbox Code Playgroud)
然后我可以开始分从路径sys.path,更换/上.并获得类似的路径- 'pack.mod'
但可能存在一些更便捷的途径?
Ale*_*lli 17
什么inspect.getmodule(f)内部确实,每inspect.py的来源,基本上是sys.modules.get(object.__module__)-我不会把使用代码直接"更方便",虽然(超越"本质"的一部分,inspect具有捕捉了很多有用的和角落的情况下校正).
为什么不直接调用inspect.getsourcefile(f)?
编辑:在线之间读取似乎OP正在尝试做类似的事情
python /foo/bar/baz/bla.py
Run Code Online (Sandbox Code Playgroud)
并且bla.py(在其中运行__main__)确定" 不同的主脚本可以使用什么from或import语句从我内部导入此函数?".
问题是,问题是不适当的,因为可能没有任何这样的路径可用于此目的(没有什么能保证sys.path当不同的主脚本稍后运行时当前主脚本的路径开启),可能有几个不同的(例如双方/foo/bar并/foo/bar/baz可能在sys.path和/foo/bar/baz/__init__.py存在,在这种情况下,from baz.bla import f和from bla import f可能都工作),并没有什么保证了一些其他的,以前的sys.path项目可能没有"抢占"的进口企图(如说/foo/bar/baz是对sys.path的,但之前有还/fee/fie/foo,且完全不相关的文件/fee/fie/foo/bla.py也存在 - 等等).
无论这种发现尝试的目的,我建议找一个替代架构-例如,一个地方from baz.bla import f 的实际执行(作为OP说,在这个问题的开始),所以f.__module__正确设置baz.bla.
你想要的__name__属性来自__module__:
In [16]: import inspect
In [17]: inspect.getmodule(MyObject).__name__
Out[17]: 'lib.objects.MyObject'
Run Code Online (Sandbox Code Playgroud)