Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1711 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Code de retour

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Code de retour

n°1957109
Tangrim
Des bisous et des nounours !
Posté le 12-01-2010 à 10:20:08  profilanswer
 

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
mood
Publicité
Posté le 12-01-2010 à 10:20:08  profilanswer
 

n°1957159
Tangrim
Des bisous et des nounours !
Posté le 12-01-2010 à 14:22:28  profilanswer
 

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
n°1957227
masklinn
í dag viðrar vel til loftárása
Posté le 12-01-2010 à 16:13:05  profilanswer
 

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
n°1957240
Tangrim
Des bisous et des nounours !
Posté le 12-01-2010 à 16:55:32  profilanswer
 

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
n°1957250
masklinn
í dag viðrar vel til loftárása
Posté le 12-01-2010 à 17:27:39  profilanswer
 

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
n°1957388
Tangrim
Des bisous et des nounours !
Posté le 13-01-2010 à 09:47:27  profilanswer
 

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
n°1957404
masklinn
í dag viðrar vel til loftárása
Posté le 13-01-2010 à 10:04:42  profilanswer
 

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
n°1957430
Tangrim
Des bisous et des nounours !
Posté le 13-01-2010 à 10:48:17  profilanswer
 

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
n°1957438
masklinn
í dag viðrar vel til loftárása
Posté le 13-01-2010 à 11:05:11  profilanswer
 

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
n°1957485
KangOl
Profil : pointeur
Posté le 13-01-2010 à 12:08:37  profilanswer
 

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...
mood
Publicité
Posté le 13-01-2010 à 12:08:37  profilanswer
 

n°1957492
Tangrim
Des bisous et des nounours !
Posté le 13-01-2010 à 12:40:15  profilanswer
 

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
n°1957512
KangOl
Profil : pointeur
Posté le 13-01-2010 à 13:41:44  profilanswer
 

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...
n°1957533
Tangrim
Des bisous et des nounours !
Posté le 13-01-2010 à 14:18:57  profilanswer
 

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
n°1957536
KangOl
Profil : pointeur
Posté le 13-01-2010 à 14:22:06  profilanswer
 

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...
n°1957550
Tangrim
Des bisous et des nounours !
Posté le 13-01-2010 à 14:39:35  profilanswer
 

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
n°1957555
masklinn
í dag viðrar vel til loftárása
Posté le 13-01-2010 à 14:53:40  profilanswer
 

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
n°1957561
Tangrim
Des bisous et des nounours !
Posté le 13-01-2010 à 15:02:30  profilanswer
 

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
n°1957563
masklinn
í dag viðrar vel til loftárása
Posté le 13-01-2010 à 15:16:03  profilanswer
 

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
n°1957590
Tangrim
Des bisous et des nounours !
Posté le 13-01-2010 à 16:22:05  profilanswer
 

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
n°1957634
masklinn
í dag viðrar vel til loftárása
Posté le 13-01-2010 à 17:12:39  profilanswer
 

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
n°1957724
Tangrim
Des bisous et des nounours !
Posté le 13-01-2010 à 20:43:10  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Code de retour

 

Sujets relatifs
Net::ftp code retourcode retour main()
Code retour et gestion des erreursCode retour Java sous Unix
Code de retour FTP.ExeComment gérer un code retour d'une procédure SQL serveur en VB
code retour de la commande 'execute sql'...Code de retour d'un batch windows
fork et code retour 
Plus de sujets relatifs à : Code de retour


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR