Frage

Ich hatte nicht viel Glück bei der Suche nach einer guten Erklärung dafür, was ungültige Argumentfehler sind und was sie verursachen würde.

Mein aktuelles Beispiel, mit dem ich arbeite, ist

import sys
mylog="mylog.log"
sys.stdout = open(mylog,'w')
#lots of code
#.
#.
#.
#End of lots of code
from time import clock
print "blablabla",clock()

Ich erhalte einen IOError Ungültiges Argument Fehler auf der Taktleitung.Ich habe es auch versucht

print "blablabla\t%s"%clock()

Jede Information über diesen Fehler wäre eine große Hilfe.Diese Zeilen funktionieren bei kurzen Auflagen einwandfrei, kurz nachdem der Code eine Weile ausgeführt wurde, bricht er ab.Ich habe versucht, die Puffergröße auf etwas Niedriges wie 45-100 Zeilen einzustellen.

War es hilfreich?

Lösung

Ich kann dieses genaue Problem nicht auf meinem eigenen Computer reproduzieren, daher kann ich keine spezifischen Ratschläge geben, aber hier finden Sie einige allgemeine Kommentare zum Debuggen solcher Dinge.

Wenn in einer IOError- oder OSError-Ausnahme von Python "Ungültiges Argument" angezeigt wird, bedeutet dies, dass der Interpreter versucht hat, einen Systemaufruf durchzuführen, der fehlgeschlagen ist und festgelegt wurde errno zum Kodex EINVAL.(Tangential sollte Python die numerischen Werte für Fehlercodes wirklich nicht drucken - die symbolischen Namen sind standardisiert, die Zahlen jedoch nicht.) Das erste, was Sie tun müssen, ist herauszufinden, welcher Systemaufruf es war, und der einfachste Weg, dies zu tun, besteht darin, Ihr Programm unter dem Befehl auszuführen strace dienstprogramm, wie folgt:

$ strace -f -o strace.log python yourscript.py [arguments...]

Warten Sie, bis es fehlschlägt, und durchsuchen Sie dann die Datei strace.log für "-1 E" (genau diese Zeichenfolge).Sie werden so etwas finden:

times({tms_utime=162, tms_stime=123, tms_cutime=0, tms_cstime=0}) = 1718279979
write(1, "2.85\n", 5)                   = -1 EINVAL (Invalid argument)

Sie lesen dann die Manpage für den fehlgeschlagenen Systemaufruf ("man 2 write" in diesem Fall) und suchen Sie nach dem errno-Codenamen (EINVAL in diesem Fall), und sehen, was es sagt, ist schief gelaufen.

In diesem Fall vermute ich stark, dass Sie entweder im Python-Interpreter oder im Betriebssystem einen Fehler gefunden haben."Ungültiges Argument" bedeutet, was es sagt - eines der Eingabeargumente für den Systemaufruf hatte einen ungültigen Wert.Sie machen in Ihrem Skript nichts Kniffliges, also bringt entweder der Interpreter seine Systemaufrufe durcheinander oder der Kernel hat falsch verstanden, was der Interpreter wollte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top