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()
我正在跟踪这样一个 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()