我已经研究了其他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
的期望,但是它只是在列表中的同一文件上执行,直到得到MemoryError
或RecursionError
。
总的来说,我正在编写一个命令行程序,该程序将对作为命令行参数传入的文件运行不同的外部探查器,分析结果并将数据保存在平面文件中以进行分析。我不想为这些事件探查器修改任何代码即可运行并生成报告。那可能是一个单独的项目。
我们将非常感谢您的帮助。
谢谢!
答案 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)