让我们想象一下,我有一个模块foo.py
,声明了一个函数foofunc
:
def foofunc():
# smart things
return
还有两个不同的模块 - bar.py
和spam.py
,其中存在直接执行foo
模块函数的代码。
# `bar` module. All rights reserved.
from foo import foofunc
def run_foofunc():
return foofunc()
另一个模块中的相同内容:
# `spam` module. All rights reserved.
from foo import foofunc
def run_foofunc():
return foofunc()
我需要知道在不知道可能的地方的情况下执行功能的位置。类似的东西:
def foofunc():
print inspect.executedfrom()
将在标准输出中执行类似的操作
<pack.bar.run_foofunc>
在现实世界中它有类似之处吗?
答案 0 :(得分:2)
冒着不回答实际问题的风险,你写道,你需要它进行研究和调试。
我认为traceback
模块对此非常有用。
import traceback
traceback.print_stack()
另请查看pdb
,它允许您在运行时以交互方式单步执行代码。
答案 1 :(得分:2)
<强> test.py:强>
import inspect
def foofunc():
frame, filename, line_number, function_name, lines, index = inspect.getouterframes(
inspect.currentframe())[1]
print(filename, line_number, function_name)
return
<强> foo.py:强>
import test
def run_foofunc():
test.foofunc()
run_foofunc()
产量
('/tmp/foo.py', 3, 'run_foofunc')
答案 2 :(得分:0)
以下是executed_from
:
import inspect
def executed_from():
f = inspect.currentframe().f_back.f_back
return "%s.%s" % (inspect.getmodule(f).__name__, f.f_code.co_name)
答案 3 :(得分:0)
在等待你的答案期间,我找到了自己的答案。通过在调试函数中引发异常并逐层进行回溯,可以解决此问题。这种方法通常很糟糕,因为它会停止执行,但在我的特定情况下并不坏。此外,它非常pythonic,易于清洁。