Comment rediriger stderr en Python?
Je voudrais connecter la sortie d'un script Python. J'ai essayé:
import sys
log = []
class writer(object):
def write(self, data):
log.append(data)
sys.stdout = writer()
sys.stderr = writer()
Maintenant, si j'ai "l'impression" quelque chose "" c'est journalisé. Mais si je fais par exemple erreur de syntaxe, dire "imprimer" quelque chose# ", il l'habitude de se connecté - il aller dans la console à la place.
Comment puis-je capture aussi les erreurs à partir de l'interpréteur Python?
J'ai vu une solution possible ici:
http://www.velocityreviews.com/forums/showpost.php?p=1868822&postcount=3
mais le deuxième exemple logs dans /dev/null - ce n'est pas ce que je veux. Je voudrais l'enregistrer dans une liste comme mon exemple ci-dessus ou StringIO ou tel...
Également, de préférence, je ne veux pas créer un sous-processus (et de lire le stdout et stderr dans le thread séparé).
source d'informationauteur EcirH
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire n'importe quoi dans le code Python qui permet de capturer les erreurs lors de la compilation du même code. Comment pourrait-il? Si le compilateur ne peut pas terminer la compilation du code, il ne sera pas exécuté le code, de sorte que votre redirection n'a pas encore pris effet.
C'est là que votre (indésirable) sous-processus. Vous pouvez écrire du code Python qui redirige la sortie standard (stdout), puis appelle l'interpréteur Python pour compiler quelque autre morceau de code.
J'ai un morceau de logiciel que j'ai écrit pour le travail qui capture stderr dans un fichier comme ceci:
il est donc certainement possible.
Je crois que votre problème est que vous êtes la création de deux instances de l'écrivain.
Peut-être quelque chose de plus comme:
Je ne pense pas d'une manière facile. Le python standard du processus d'erreur est de vivre sur un niveau inférieur à celui d'un fichier python objet (C ou python).
Vous pouvez rassembler le script python dans un deuxième script python et utiliser des sous-processus.Popen. Il est également possible de tirer un peu de magie comme cela dans un seul script:
Et sélectionner.poll() pour vérifier chat.stdout régulièrement pour trouver la sortie.
Oui, qui semble fonctionner.
Le problème je pense est que la plupart du temps, quelque chose d'imprimé sur stderr par python indique qu'il est sur le point de quitter. La plus habituelle façon de gérer cela pourrait être par l'intermédiaire des exceptions.
---------Edit
En quelque sorte, j'ai raté l'os.pipe() fonction.
Alors de lire à partir de r
En fait, si vous êtes sous linux/mac os, vous pouvez utiliser le fichier de redirection pour le faire. Par exemple, si vous allez exécuter "une.py" et d'enregistrer tous les messages qu'il va générer dans le fichier "."il serait juste
python a.py 2>&1 > a.out
La première partie redirige stderr vers stdout, et la deuxième qui redirige vers un fichier appelé..
Pour une plus longue liste d'opérateurs de redirection dans Linux/Unix, voir https://askubuntu.com/questions/420981/how-do-i-save-terminal-output-to-a-file