Code de retour

Code de retour - Python - Programmation

Marsh Posté le 12-01-2010 à 10:20:08    

Bonjour.
 
J'ai un programme python qui effectue de nombreuses requetes sur un base de données.
 
Existe-t-il une variable équivalente à $? en shell pour gérer les erreurs, je trouve assez lourds de faire ça avec if.
 
De même j'ai une portion de code telle que:
 

Code :
  1. if ( os.system('scp "%s" "%s"' % (source, destination) ) == 0):
  2. return 0
  3. else:
  4. return 1


 
Est-il possible de récupérer l'erreur qui s'affiche dans le prompt en cas d'échec (pour mettre dans un fichier de log) ? Le code de retour est 256, ce qui est moins parlant que
"ssh: Could not resolve hostname monserveur: Name or service not known".
 
Merci pour vos réponses.


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 12-01-2010 à 10:20:08   

Reply

Marsh Posté le 12-01-2010 à 14:22:28    

Pour la deuxième partie de ma question, j'ai trouvé ça:

Code :
  1. import sys
  2. fsock = open('error.log', 'w')
  3. sys.stderr = fsock
  4. raise Exception, 'this error will be logged'


C'est pas mal, la dedans j'ai les erreurs python, j'ai essayé en remplaçant stderr par stdout donc, mais ça ne fonctionne toujours pas.

 

Je me demande: si comme j'appelle un os.system pour le scp, c'est peut être sh qui m'écrit l'erreur, est il possible dans ce cas de récupérer ça en python ?

 

edit: c'est effectivement le cas :s


Message édité par Tangrim le 12-01-2010 à 14:26:10

---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 12-01-2010 à 16:13:05    

Oskour [:totoz]

 

Faut pas utiliser os.system si tu as besoin de faire autre chose que "j'appelle un utilitaire basique et c'est tout".

 

Vas vite voir le contenu du module subprocess, vilain chenapan. D'ailleurs t'es même plus censé utiliser os.system en fait, subprocess.call et subprocess.check_call sont largement mieux.

 

Quand à la 2e partie de la question, ugh

Message cité 1 fois
Message édité par masklinn le 12-01-2010 à 16:17:26

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-01-2010 à 16:55:32    

masklinn a écrit :

Oskour [:totoz]
 
Faut pas utiliser os.system si tu as besoin de faire autre chose que "j'appelle un utilitaire basique et c'est tout".
 
Vas vite voir le contenu du module subprocess, vilain chenapan. D'ailleurs t'es même plus censé utiliser os.system en fait, subprocess.call et subprocess.check_call sont largement mieux.
 
Quand à la 2e partie de la question, ugh


Oui je viens de voir ça.
 
(Dans la doc c'est pas écrit que c'est deprecié).
 
Avec le subprocess.call j'arrive à avoir le code retour (0 ou 1) mais pas le message du prompt (ce que je cherche).
 
 

Code :
  1. import sys
  2. from subprocess import *
  3. import os
  4. fsock = open('erreur.log', 'w')
  5. sys.stdout = fsock
  6. retcode = call("scp monserveur:source destination", shell=True)
  7. if retcode < 0:
  8. print >>sys.stdout, -retcode
  9. else:
  10. print >>sys.stdout, retcode


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 12-01-2010 à 17:27:39    

Franchement, je te suggère de passer par paramiko (qui fait du sftp, même si ça gère pas le scp).
 
Sinon, http://bazaar.launchpad.net/~jbard [...] zz9ww66y-1 ou (plus gore) http://www.palovick.com/code/pytho [...] client.php


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-01-2010 à 09:47:27    

masklinn a écrit :

Franchement, je te suggère de passer par paramiko (qui fait du sftp, même si ça gère pas le scp).
 
Sinon, http://bazaar.launchpad.net/~jbard [...] zz9ww66y-1 ou (plus gore) http://www.palovick.com/code/pytho [...] client.php


C'est un peu sortir le porte-avion pour tuer une mouche.
 
J'ai pondu ça, ça fonctionne:

Code :
  1. from subprocess import *
  2. p=Popen('scp %s %s &>> %s' % (source,destination,log), shell=True )
  3. p.communicate()


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 13-01-2010 à 10:04:42    

Tangrim a écrit :


C'est un peu sortir le porte-avion pour tuer une mouche.


Bah pas spécialement, paramiko ça marche bien et ça permet de pas faire des bricolages à la con en IPC avec des softs pas créés pour faire de l'IPC ou servir d'APIs.

Message cité 1 fois
Message édité par masklinn le 13-01-2010 à 10:04:59

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-01-2010 à 10:48:17    

masklinn a écrit :


Bah pas spécialement, paramiko ça marche bien et ça permet de pas faire des bricolages à la con en IPC avec des softs pas créés pour faire de l'IPC ou servir d'APIs.


Tu m'as perdu :s
 
(IPS= Inter Processus Communication ?)
 
Je n'avais que cette partie de code qui me demandait d'utiliser des commandes shell, j'ai regardé un peu paramiko, mais je crois que (pour le moment) c'est un peu compliqué pour moi.


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 13-01-2010 à 11:05:11    

Tangrim a écrit :

(IPS= Inter Processus Communication ?)


ui [:romf]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-01-2010 à 12:08:37    

Tangrim a écrit :


C'est un peu sortir le porte-avion pour tuer une mouche.
 
J'ai pondu ça, ça fonctionne:

Code :
  1. from subprocess import *
  2. p=Popen('scp %s %s &>> %s' % (source,destination,log), shell=True )
  3. p.communicate()



bravo, sur 4 lignes, la seule qui est correct est la ligne vide...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 13-01-2010 à 12:08:37   

Reply

Marsh Posté le 13-01-2010 à 12:40:15    

KangOl a écrit :


bravo, sur 4 lignes, la seule qui est correcte est la ligne vide...


Tu peux m'expliquer le pourquoi ?
 
Sinon j'ai aussi réussi avec call, je ne vois pas trop ce que ça change.


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 13-01-2010 à 13:41:44    

1/ pas de

Code :
  1. from somepackage import *

ca pollue le namespace global
2/ Popen peut prendre un tableau avec les arguments
3/ pourquoi faire la redirection manuellement ??
 
un code correct resemblerai à ça :

Code :
  1. import subprocess
  2. p = subprocess.Popen(['scp', source, destination], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  3. p.communicate()


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 13-01-2010 à 14:18:57    

KangOl a écrit :

1/ pas de

Code :
  1. from somepackage import *

ca pollue le namespace global
2/ Popen peut prendre un tableau avec les arguments
3/ pourquoi faire la redirection manuellement ??
 
un code correct resemblerai à ça :

Code :
  1. import subprocess
  2. p = subprocess.Popen(['scp', source, destination], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  3. p.communicate()



Merci.
 
Mais dans ton exemple sans la redirection manuelle la sortie du scp n'est pas enregistrée dans le fichier de log, stderr et stdout concernent les sortie python, pas celle du shell (en tout cas en testant c'est comme ça que je l'ai compris).
 

Spoiler :

La dernière ligne aussi était bien ^^


Message édité par Tangrim le 13-01-2010 à 14:19:58

---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 13-01-2010 à 14:22:06    

tu peux récupérer le résultat de p.communicate()
tu peux aussi passer le paramètre shell a Popen


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 13-01-2010 à 14:39:35    

Code :
  1. >>> p = subprocess.Popen(['scp', source, destination], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  2. >>> print p.communicate()
  3. ('', 'ssh: Could not resolve hostname monserveur: Name or service not known\r\n')
  4. >>> p.communicate.__class__
  5. <type 'instancemethod'>
  6. >>> ret=p.communicate
  7. >>> ret.__class__
  8. <type 'instancemethod'>
 

En effet j'ai bien le message désiré dans p.communicate, pas contre je n'arrive pas à recuperer ma phrase, je pensais que c'était une liste mais le __class__ me montre que non.

Message cité 1 fois
Message édité par Tangrim le 13-01-2010 à 14:41:00

---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 13-01-2010 à 14:53:40    

Tangrim a écrit :

Code :
  1. >>> p = subprocess.Popen(['scp', source, destination], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  2. >>> print p.communicate()
  3. ('', 'ssh: Could not resolve hostname monserveur: Name or service not known\r\n')
  4. >>> p.communicate.__class__
  5. <type 'instancemethod'>
  6. >>> ret=p.communicate
  7. >>> ret.__class__
  8. <type 'instancemethod'>
 

En effet j'ai bien le message désiré dans p.communicate, pas contre je n'arrive pas à recuperer ma phrase, je pensais que c'était une liste mais le __class__ me montre que non.


Faudrait peut-être penser à lire la docG [:sadnoir]

 

http://docs.python.org/library/sub [...] ommunicate

 

accessoirement, prière d'utiliser type(foo) pas foo.__class__ (qui est un détail d'implémentation):

Code :
  1. >>> int.__class__
  2. <type 'type'>
  3. >>> type(int)
  4. <type 'type'>
  5. >>>


Et le shell Python a une fonction "help" très pratique.


Message édité par masklinn le 13-01-2010 à 14:56:04

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-01-2010 à 15:02:30    

Un tuple !

Code :
  1. >>> p = subprocess.Popen(['scp', source, destination], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  2. >>> ret=p.communicate()
  3. >>> ret[0]
  4. ''
  5. >>> ret[1]
  6. 'scp: /var/log/betalicense.log: No such file or directory\n'


 
Ça fontionne bien, merci beaucoup pour m'avoir "nettoyé" ce code.


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 13-01-2010 à 15:16:03    

Tangrim a écrit :

Un tuple !

Code :
  1. >>> p = subprocess.Popen(['scp', source, destination], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  2. >>> ret=p.communicate()
  3. >>> ret[0]
  4. ''
  5. >>> ret[1]
  6. 'scp: /var/log/betalicense.log: No such file or directory\n'


 
Ça fontionne bien, merci beaucoup pour m'avoir "nettoyé" ce code.


Je suggère aussi d'utiliser le tuple unpacking, parce que là c'esrt sale ton truc:

Code :
  1. >>> out, err = p.communicate()
  2. >>> out
  3. ''
  4. >>> err
  5. 'scp: /var/log/betalicense.log: No such file or directory\n'


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-01-2010 à 16:22:05    

masklinn a écrit :


Je suggère aussi d'utiliser le tuple unpacking, parce que là c'esrt sale ton truc:

Code :
  1. >>> out, err = p.communicate()
  2. >>> out
  3. ''
  4. >>> err
  5. 'scp: /var/log/betalicense.log: No such file or directory\n'



Je trouve ça moins lisible, mais puisque tu dis que ce n'est pas propre je vais suivre ton conseil  :jap: .

Message cité 1 fois
Message édité par Tangrim le 13-01-2010 à 16:24:26

---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le 13-01-2010 à 17:12:39    

Tangrim a écrit :


Je trouve ça moins lisible


t'as deux variables clairement nommées au lieu d'avoir une variable au nom qui ne veut rien dire avec deux index complètement arbitraires… en quoi c'est moins lisible [:pingouino dei]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-01-2010 à 20:43:10    

masklinn a écrit :


t'as deux variables clairement nommées au lieu d'avoir une variable au nom qui ne veut rien dire avec deux index complètement arbitraires… en quoi c'est moins lisible [:pingouino dei]


Je m'y étais habitué, j'ai pleins de tuples dans une autre partie du programme, mais t'as raison quelque part.


---------------
Des Bisous et des nounours ! | Internet 2025 | Dungeon-Generator
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed