在Python中的文件列表上运行cProfile

时间:2018-10-29 17:00:53

标签: python cprofile

我已经研究了其他SOF文章,了解如何做到这一点,并且很长时间以来一直在修改代码,却一无所获。我还观看了有关配置文件的YouTube视频,并尝试了cProfile文档中的示例,但它们似乎没有涵盖迭代。似乎没人在讨论在可迭代对象中的文件上使用cProfile

所以,到目前为止,这是我仍然无法使用的功能。什么不起作用?好吧,cProfile.py使用递归并且不会到达下一个文件进行迭代。

我已经尝试了一个递归函数,而while循环,for循环都没关系。 __iter__似乎抓住了__next__cProfile.pycProfile.py似乎陷入了无限循环。我必须使用32位Python,因此该代码将一遍又一遍地运行列表中的1个或2个文件,直到Python抛出MemoryError

我想运行一些代码来创建文件列表,遍历该列表,然后运行cProfile.run() _或对它们调用Python命令功能。

我必须更改递归限制,以使我的代码没有递归错误,但随后它会一直运行到无限地增大较大的递归限制为止。我根本不想这样做。实际上,它将同时处理列表中的2个文件,并且永远不会继续。我尝试添加命令行参数,但仍然无法正常工作,因为问题似乎出在cProfile.py内部以及我的使用方式。

from subprocess import call
from glob import glob
from sys import argv, setrecursionlimit

setrecursionlimit(10000)
files = glob('**/*.py', recursive=True)

def run_cProfile(file):
    call(['python', '-m', 'cProfile', '-s', 'ncalls', file])

for file in files:
    if file == argv[0]:
        continue
    print('Processing file: {}'.format(file))
    run_cProfile(file)

输出显示您对cProfile的期望,但是它只是在列表中的同一文件上执行,直到得到MemoryErrorRecursionError

总的来说,我正在编写一个命令行程序,该程序将对作为命令行参数传入的文件运行不同的外部探查器,分析结果并将数据保存在平面文件中以进行分析。我不想为这些事件探查器修改任何代码即可运行并生成报告。那可能是一个单独的项目。

我们将非常感谢您的帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

条件if file == argv[0]:不会阻止您再次调用同一脚本,因为您正在检查起始脚本的完全限定路径到glob找到的相对于当前目录的脚本路径。例如

print(argv[0])
print(file)

/home/yourlogin/startscript.py
startscript.py

您可能希望将其更改为:

from os import path

for file in files:
    _, startname = path.split(argv[0])
    if file == startname:
        continue
    print('Processing file: {}'.format(file))
    run_cProfile(file)