2010-07-13 4 views
1

Je n'ai pas eu beaucoup de chance de chercher pour trouver une bonne explication de ce que sont les erreurs invalides et ce qui les causerait.IOError: [Errno 22] Argument invalide avec clock() étant passé en

Mon échantillon actuel Je travaille avec est

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() 

Je reçois un IOError non valide Erreur d'argument sur la ligne d'horloge. J'ai également essayé

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

Toute information à propos de cette erreur serait d'une grande aide. Ces lignes fonctionnent parfaitement bien sur de courts tirages, juste après avoir exécuté le code pendant un certain temps. J'ai essayé de placer la taille de la mémoire tampon à quelque chose de bas comme 45-100 lignes.

Répondre

3

Je ne peux pas reproduire exactement ce problème sur mon propre ordinateur, donc je ne peux pas donner de conseils spécifiques, mais voici quelques commentaires généraux sur la façon de déboguer ce genre de chose.

Quand vous voyez « Argument non valide » dans une exception IOError ou OSError de python, cela signifie que l'interprète a essayé de faire un appel système qui a échoué et mis errno au code EINVAL. (Tangentiellement, python ne devrait pas vraiment imprimer les valeurs numériques pour les codes errno - les noms symboliques sont normalisés mais les chiffres ne le sont pas.) La première chose à faire est de trouver quel appel système il a été, et le plus simple faire est de lancer votre programme sous l'utilitaire strace, comme ceci:

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

Attendez à l'échec, puis recherchez le fichier strace.log pour « -1 E » (exactement cette chaîne). Vous trouverez quelque chose comme ceci:

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

Vous pouvez alors lire la page de manuel pour l'appel système (dans ce cas « man 2 write ») a échoué et chercher le nom de code errno (EINVAL dans ce cas), et voir ce qu'il dit a mal tourné.

Dans ce cas, je soupçonne fortement que vous avez trouvé un bogue dans l'interpréteur Python ou dans le système d'exploitation. "Argument invalide" signifie ce qu'il dit - l'un des arguments d'entrée de l'appel système avait une valeur invalide. Vous ne faites rien de compliqué dans votre script, donc soit l'interpréteur gâche ses appels système, soit le noyau ne comprend pas ce que l'interprète voulait.

+0

Je fais beaucoup de choses dans mon script. Je cours ce type de déclarations d'impression encore et encore plusieurs fois. Que se passe-t-il avant que l'impression tente d'exécuter une commande ATA spécifique sur un lecteur distinct et d'imprimer ce qui s'est passé. Votre solution est excellente sur Linux, mais malheureusement je travaille avec Python 2.5 sur une machine Windows 7. –

+0

Aussi question subsidiaire, comment suggérez-vous d'éviter une telle erreur? –

+1

Il aurait été utile que vous ayez mentionné le système d'exploitation et la version Python utilisés, dans votre question. Il y a des * équivalents * à stracer pour Windows - j'essayerais probablement d'abord l'utilitaire Microsoft Process Monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx). Je suppose que votre problème est en fait avec la commande ATA que vous essayez d'exécuter, et l'erreur IOError est attachée à l'appel clock() par erreur, mais sans voir cette partie du code, c'est difficile à dire. – zwol

Questions connexes