Python模块" trace":文件路径丢失

时间:2018-05-30 07:10:31

标签: python tracing

我正在跟踪这样的python脚本:

import java.util.*;

public class So {
    public static void searchForNumbers(int[] sourceArray) {
        System.out.println("source array = " + Arrays.toString(sourceArray));
        List<Integer> ai = new ArrayList<>();
        for (int i = 0; i < sourceArray.length; i++) {
            if( Integer.toString(sourceArray[i]).matches(".*[1-3].*")) {
                ai.add(sourceArray[i]);
            }
        }
        if (ai.isEmpty()) {
            System.out.println(-1);
        } else {
            ai.sort(Comparator.naturalOrder());
            System.out.println(ai);
        }
    }

    public static void main(String[] args) {
        Scanner mew = new Scanner(System.in);
        int numberOfTimesToAskForNumbers = mew.nextInt();
        System.out.println("numberOfTimesToAskForNumbers = " + numberOfTimesToAskForNumbers);
        for (int i = 0; i < numberOfTimesToAskForNumbers; i++) {
            int amountOfNumbersInThisRound = mew.nextInt();
            System.out.println("amountOfNumbersInThisRound = " + amountOfNumbersInThisRound);
            int a[] = new int[amountOfNumbersInThisRound];
            for (int j = 0; j < amountOfNumbersInThisRound; j++) {
                a[j] = mew.nextInt();
                System.out.println("a[j] = " + a[j]);
            }
            searchForNumbers(a);
        }
    }
}

有些行看起来像这样:

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 的文件名(包括路径)?

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

在此上下文中使用 Python 2.7

  

我没有修复标准库&#34; trace&#34;。如果它提供了所需的功能,我可以使用不同的库。

3 个答案:

答案 0 :(得分:3)

如果目的是找到完整路径,然后检查hunter项目,它甚至支持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()

答案 1 :(得分:0)

不幸的是,没有标志/命令行选项来启用它。因此,立即(可能是正确的)答案是:

如果您对使用内置库感到困惑,可以通过更改以下行来轻松实现:

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选项和修改后的路径,但与原始路径完全相同。

答案 2 :(得分:0)

您可以使用以下内容

创建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