运行 cProfile Python 中的文件列表
Run cProfile over a list of files in Python
我已经研究了其他关于如何执行此操作的 SOF 文章,并且已经修改了很长时间的代码,却一无所获。我还观看了有关概要分析的 YouTube 视频,并尝试了 cProfile 文档中的示例,但它们似乎没有涵盖迭代。似乎没有人讨论在可迭代对象中的文件上使用 cProfile
。
所以,截至目前,这是我所拥有的仍然不起作用的方法。什么不起作用?好吧,cProfile.py
使用递归并且不会到达下一个文件进行迭代。
我试过递归函数,while循环,for循环,都没有关系。一旦__iter__
和__next__
似乎被cProfile.py
拾取,cProfile.py
似乎运行陷入无限循环。我必须使用 32 位 Python,因此此代码将 运行 遍历列表中的 1 或 2 个文件,一遍又一遍,直到 Python 抛出 MemoryError
。
我想运行一些代码来创建文件列表,遍历列表,然后运行cProfile.run()
_或调用Python命令函数他们。
我必须更改递归限制以使我的代码没有递归错误,但它只是 运行s 直到无限大的递归限制。我根本不想这样做。事实上,它会同时处理列表中的 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
的期望,但它只是在列表中的同一文件上打印,直到我得到 MemoryError
或 RecursionError
。
总的来说,我正在编写一个命令行程序,它将 运行 不同的外部分析器对作为命令行参数传入的文件进行分析,解析结果并将数据保存在一个平面文件中分析。我不想将这些分析器的任何代码修改为 运行 并生成报告。那可能是一个单独的项目。
非常感谢您的帮助。
谢谢!
条件 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)
我已经研究了其他关于如何执行此操作的 SOF 文章,并且已经修改了很长时间的代码,却一无所获。我还观看了有关概要分析的 YouTube 视频,并尝试了 cProfile 文档中的示例,但它们似乎没有涵盖迭代。似乎没有人讨论在可迭代对象中的文件上使用 cProfile
。
所以,截至目前,这是我所拥有的仍然不起作用的方法。什么不起作用?好吧,cProfile.py
使用递归并且不会到达下一个文件进行迭代。
我试过递归函数,while循环,for循环,都没有关系。一旦__iter__
和__next__
似乎被cProfile.py
拾取,cProfile.py
似乎运行陷入无限循环。我必须使用 32 位 Python,因此此代码将 运行 遍历列表中的 1 或 2 个文件,一遍又一遍,直到 Python 抛出 MemoryError
。
我想运行一些代码来创建文件列表,遍历列表,然后运行cProfile.run()
_或调用Python命令函数他们。
我必须更改递归限制以使我的代码没有递归错误,但它只是 运行s 直到无限大的递归限制。我根本不想这样做。事实上,它会同时处理列表中的 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
的期望,但它只是在列表中的同一文件上打印,直到我得到 MemoryError
或 RecursionError
。
总的来说,我正在编写一个命令行程序,它将 运行 不同的外部分析器对作为命令行参数传入的文件进行分析,解析结果并将数据保存在一个平面文件中分析。我不想将这些分析器的任何代码修改为 运行 并生成报告。那可能是一个单独的项目。
非常感谢您的帮助。
谢谢!
条件 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)