0

让我们想象一下,我有一个foo.py声明了函数的模块foofunc

def foofunc():
    # smart things
    return

还有两个不同的模块 -bar.pyspam.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>

它在现实世界中有类似的东西吗?

4

4 回答 4

2

测试.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')
于 2013-08-28T13:56:35.843 回答
2

冒着不回答实际问题的风险,您写道,您需要它来进行研究和调试。

我认为该traceback模块非常适合。

import traceback
traceback.print_stack()

另请查看pdb,它允许您在运行时以交互方式单步执行您的代码。

于 2013-08-28T13:55:09.183 回答
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)
于 2013-08-28T14:02:50.647 回答
0

在等待您的答案期间,我找到了自己的答案。这个问题可以通过在调试函数中引发异常并逐层追溯来解决。这种方法通常很糟糕,因为它会停止执行,但在我的特定情况下还不错。此外,它非常蟒蛇且易于清洁。

于 2013-08-28T14:33:50.623 回答