Fehler beim Versuch, cProfile-Informationen in eine Datei zu schreiben
-
21-12-2019 - |
Frage
Ich versuche, ein cProfile-Profil zu laden, etwas zu sortieren und zu verfeinern und dann die Ergebnisse in eine Datei auszugeben.Basierend auf Dokumentation, dachte ich, ich könnte einfach ein Dateiobjekt übergeben und das print_stats
Die Funktion würde zu diesem Stream umleiten.
Hier ist der Code, den ich verwenden möchte:
import sys,pstats
s = open('output.txt', 'w')
p = pstats.Stats('profile.dat', s)
und hier ist der resultierende Fehler:
TypeError: Cannot create or construct a <class pstats.Stats at 0xbaa870> object from '<open file 'output.txt', mode 'w' at 0xb2ef60>''
Ich sollte auch hinzufügen, dass die Ausgabe im Terminal wie gewohnt erscheint, wenn ich kein Objekt an den Stream-Parameter übergebe.
Lösung
Wenn Sie sich den Quellcode ansehen, müssten Sie die Datei als übergeben stream
Schlüsselwortargument (mir ist nicht klar, warum es so implementiert wurde ...), wie:
p = pstats.Stats('profile.dat', stream = s)
Siehe unten den Inline-Kommentar und die if "stream" in kwds
Linie.
class Stats:
"""..."""
def __init__(self, *args, **kwds):
# I can't figure out how to explictly specify a stream keyword arg
# with *args:
# def __init__(self, *args, stream=sys.stdout): ...
# so I use **kwds and sqauwk if something unexpected is passed in.
self.stream = sys.stdout
if "stream" in kwds:
self.stream = kwds["stream"]
del kwds["stream"]
if kwds:
keys = kwds.keys()
keys.sort()
extras = ", ".join(["%s=%s" % (k, kwds[k]) for k in keys])
raise ValueError, "unrecognized keyword args: %s" % extras
if not len(args):
arg = None
else:
arg = args[0]
args = args[1:]
self.init(arg)
self.add(*args)