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

Posted

技术标签:

【中文标题】在 Python 中的文件列表上运行 cProfile【英文标题】:Run cProfile over a list of files in Python 【发布时间】:2018-10-29 17:00:53 【问题描述】:

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

所以,到目前为止,我所拥有的仍然无法正常工作。什么不起作用?好吧,cProfile.py 使用递归,不会进入下一个文件进行迭代。

我试过递归函数,while循环,for循环,没关系。只要__iter____next__ 似乎被cProfile.py 拾取,cProfile.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】:

条件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)

【讨论】:

以上是关于在 Python 中的文件列表上运行 cProfile的主要内容,如果未能解决你的问题,请参考以下文章

带有列表理解的 Python 中的运行长度编码

如何从python中的图像中删除某些文本?

Python Tornado 中的已连接客户端列表

在文件夹中的多个文件上运行 Python 脚本 [关闭]

如何在python中更新全局变量

python_S13_02[数组列表元组]