parser une ligne de commande : problème avec noms génériques de fics

parser une ligne de commande : problème avec noms génériques de fics - Python - Programmation

Marsh Posté le 03-04-2010 à 10:54:51    

Bonjour,
j'écris en python (2.6) un petit utilitaire en ligne de commande; le format d'entrée est :
 

Code :
  1. mon_prog --source ~/rep1/rep2/*.jpg


(je travaille sour Linux)
 
Quand je parse la ligne de commande avec le module optparse, ~/rep1/rep2/*.jpg est toujours remplacé par le nom du premier fichier ayant l'extention "jpg". Voici mon code :
 

Code :
  1. parser = optparse.OptionParser()
  2. parser.add_option("-s", "--source", default="*", dest="source", type="string" )
  3. opts, args = parser.parse_args()


 
... et opts.source ne vaut pas "~/rep1/rep2/*.jpg" mais qqc comme "~/rep1/rep2/1234.jpg".
 
Malgré la doc' je ne m'en sors pas. Pourriez-vous m'aider ?
Merci d'avance !


---------------
rule #1 : trust the python
Reply

Marsh Posté le 03-04-2010 à 10:54:51   

Reply

Marsh Posté le 03-04-2010 à 11:07:28    

En fait, le premier fichier est stocké dans opts, et args est une liste contenant les autres fichiers :
 

Code :
  1. opts = "~/rep1/rep2/1234.jpg"
  2. args = [ "~/rep1/rep2/6666.jpg",
  3.          "~/rep1/rep2/6667.jpg",
  4.          ...]


 
Est-ce le comportement normal ? Je ne comprends pas pourquoi ?


---------------
rule #1 : trust the python
Reply

Marsh Posté le 03-04-2010 à 17:26:15    

suizokukan a écrit :

En fait, le premier fichier est stocké dans opts, et args est une liste contenant les autres fichiers :
 

Code :
  1. opts = "~/rep1/rep2/1234.jpg"
  2. args = [ "~/rep1/rep2/6666.jpg",
  3.          "~/rep1/rep2/6667.jpg",
  4.          ...]


 
Est-ce le comportement normal ? Je ne comprends pas pourquoi ?


 
oui, c'est le shell qui résout ton *, donc quand le python s'exécute, l'étoile a déjà été remplacé par l'ensemble des fichiers jpg du répertoire.
 
Si tu veux vraiment récupérer *, il faut protéger : python toto.py "/tmp/*.jpg"

Reply

Marsh Posté le 05-04-2010 à 10:12:58    

> Renaud, merci pour ta réponse, qui répond à ma question.
 
Je me permets de relancer le sujet avec une question du même type. Mon code est trop permissif :
 

Code :
  1. parser = optparse.OptionParser()
  2. parser.add_option("-s", "--source", default="*", dest="source", type="string" )
  3. parser.add_option("-c", "--commande", default="*", dest="commande", type="string" )
  4. opts, args = parser.parse_args()


 
laisse passer des choses comme :

Code :
  1. mon_programme --source * XXX --commande * YYY


 
Les arguments supplémentaires XXX et YYY passent directement dans la variable args, qui contient aussi mes fichiers source; je comprends la présence dans args de XXX qui vient après --source; mais comment faire pour que l'argument YYY déclenche une erreur, puisqu'il n'est pas associé à une option (par exemple ici, il n'est pas associé à --commande) ?
 
Merci d'avance !


---------------
rule #1 : trust the python
Reply

Sujets relatifs:

Leave a Replay

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