Python 模块 "trace": 缺少文件路径

Python module "trace": file path missing

我正在跟踪这样一个 python 脚本:

python -m trace --ignore-dir=$HOME/lib64:$HOME/lib:/usr -t bin/myscript.py

有些行是这样的:

 --- modulename: __init__, funcname: getEffectiveLevel
__init__.py(1325):         logger = self
__init__.py(1326):         while logger:
__init__.py(1327):             if logger.level:
__init__.py(1329):             logger = logger.parent
__init__.py(1326):         while logger:
__init__.py(1327):             if logger.level:
__init__.py(1328):                 return logger.level

不幸的是,我不知道这段代码的来源。

有没有办法查看getEffectiveLevel()的文件名(包括路径)?

当然,我可以在所有已安装的 python 代码中搜索具有此名称的方法,但我想立即查看文件路径。

在此上下文中 Python 使用 2.7

I am not fixed to the standard library "trace". I could use a different library, if it provides the needed feature.

遗憾的是,没有 flag/command-line 选项来启用它。所以直接的(可能是正确的)答案是:No.

如果您不介意乱用内置库,您可以通过更改以下行轻松实现:

print (" --- modulename: %s, funcname: %s" 
       % (modulename, code.co_name))

与:

print ("filename: %s, modulename: %s, funcname: %s"
       % (filename, modulename, code.co_name))

在 Python 安装的 trace.py 文件中。您可以使用以下命令找到该文件的路径:

>>> import trace
>>> trace.__file__

但我真的不想建议以这种方式修改库。在你这样做之前(如果你决定你真的想这样做)创建文件的备份,如果可能的话,在你完成后再次替换它。

更好的方法(虽然仍然很乱)是复制上面提到的 trace.py 文件(例如到当前工作目录)并修改复制的文件。然后你可以运行修改版本:

python path_to_modified_trace_file your_options_for_trace

没有 -m 选项和修改后的路径,但与原始路径相同。

您可以创建一个包含以下内容的 trace2.py 文件

from trace import Trace, main

original_globaltrace_lt = Trace.globaltrace_lt

def patch_Trace_globaltrace_lt(self, frame, why, arg):
    value = original_globaltrace_lt(self, frame, why, arg)
    if value:
        filename = frame.f_globals.get('__file__', "")
        print("The code is in file - %s" % (filename))
    return value

Trace.globaltrace_lt = patch_Trace_globaltrace_lt

if __name__ == "__main__":
    main()

然后 运行 如下所示

python -m trace2 --ignore-dir=$HOME/lib64:$HOME/lib:/usr -t bin/myscript.py

输出很冗长,但您可以根据需要更改函数patch_Trace_globaltrace_lt

如果目的是找到完整路径,则检查 hunter project, it even has support for query-style 跟踪。

# a modified example from docs
# do check the documentation it is easy to start with
from hunter import trace, Q, Debugger
from pdb import Pdb

trace(
    # drop into a Pdb session on``myscript.mainMethod()`` call
    Q(module="myscript", function="getEffectiveLevel", kind="call", action=Debugger(klass=Pdb)))

import myscript
myscript.mainMethod()