【问题标题】:How do I know where is a function was executed in Python?我如何知道 Python 中的函数在哪里执行?
【发布时间】:2013-08-28 13:45:03
【问题描述】:

让我们想象一下,我有一个模块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>

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

【问题讨论】:

  • 无论实际答案是什么,您似乎都做错了。你为什么要这样做?
  • 我在一个名为 OpenStack 的大型项目中工作;)而且我是新手。我需要它来研究和调试。

标签: python function introspection


【解决方案1】:

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

我认为traceback 模块非常适合。

import traceback
traceback.print_stack()

还可以查看pdb,它允许您在运行时以交互方式逐步执行代码。

【讨论】:

    【解决方案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')
    

    【讨论】:

    • 我会支持你,因为这是正确的答案,但请不要在生产代码中使用它。
    • @DaanTimmer 在我看来,如果函数的行为因调用者而异,则表明代码布局错误,应进行参数化。这样,您可以轻松地在其他地方重用该功能,对其进行单元测试,并且在移动呼叫者时不必触摸该功能。此外,使用inspect 模块对 PyPy 等 Python 解释器的速度有影响。
    【解决方案3】:

    这是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)
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 您不必引发异常,例如使用traceback 模块并将输出保存到文件中。
      猜你喜欢
      • 2014-02-07
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2012-07-02
      • 2014-03-23
      • 1970-01-01
      相关资源
      最近更新 更多