Probleme passage d'argument shell unix -> py
Magicjibus
-
4 avril 2003 à 10:29
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 -
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 -
Bonjour,
j'ai un problème pour passer des arguments d'un shell Unix à un script python.
Voici mon problème :
Dans le shell unix :
$A="toto"
$B="deux mots"
./jpython prog.py "$A" "$B"
Dans le code python je récupère les infos suivantes :
print sys.argv[0] # affiche "prog"
print sys.argv[1] # affiche "toto"
print sys.argv[2] # affiche "deux"
print sys.argv[3] # affiche "mots"
Je voudrais savoir comment récupérer "deux" et "mots" dans le même argument.
J'ai essayé de passer la chaine "deux mots" entre '', mais rien n'y fait, car je récupère
print sys.argv[2] # affiche "'deux"
print sys.argv[3] # affiche "mots'"
Est ce que quelqu'un a une solution ?
Merci d'avance
j'ai un problème pour passer des arguments d'un shell Unix à un script python.
Voici mon problème :
Dans le shell unix :
$A="toto"
$B="deux mots"
./jpython prog.py "$A" "$B"
Dans le code python je récupère les infos suivantes :
print sys.argv[0] # affiche "prog"
print sys.argv[1] # affiche "toto"
print sys.argv[2] # affiche "deux"
print sys.argv[3] # affiche "mots"
Je voudrais savoir comment récupérer "deux" et "mots" dans le même argument.
J'ai essayé de passer la chaine "deux mots" entre '', mais rien n'y fait, car je récupère
print sys.argv[2] # affiche "'deux"
print sys.argv[3] # affiche "mots'"
Est ce que quelqu'un a une solution ?
Merci d'avance
A voir également:
- Probleme passage d'argument shell unix -> py
- Classic shell - Télécharger - Personnalisation
- Passage qwerty azerty - Guide
- Ipconfig unix ✓ - Forum Linux / Unix
- Test passage windows 11 - Guide
- Passage à windows 11 gratuit - Guide
8 réponses
Kuching
Messages postés
2702
Date d'inscription
jeudi 30 mai 2002
Statut
Contributeur
Dernière intervention
26 décembre 2007
157
5 avril 2003 à 03:49
5 avril 2003 à 03:49
Salut,
Le spécialiste Python du forum c'est SebSauvage ... devrait pas tarder.
A+ K.
It's going down ...
Le spécialiste Python du forum c'est SebSauvage ... devrait pas tarder.
A+ K.
It's going down ...
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 663
7 avril 2003 à 10:34
7 avril 2003 à 10:34
Me vlà ! :-)
Pour parser la ligne de commande, je te recommande vivement d'utiliser le module getopt.
ça te permettra de récupérer correctement les noms de fichier comportant des espaces en argument.
Pour parser la ligne de commande, je te recommande vivement d'utiliser le module getopt.
ça te permettra de récupérer correctement les noms de fichier comportant des espaces en argument.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 663
7 avril 2003 à 10:35
7 avril 2003 à 10:35
Ah oui tant que j'y pense:
Unix ne supporte pas les noms de fichiers comportant des espaces :)
Unix ne supporte pas les noms de fichiers comportant des espaces :)
Merci, je vais essayé de voir du côté de getopt, mais à ma connaissance, cette fonction servait principalement à parser les options que l'on pouvait avoir en ligne de commande d'un script, et non à récupérer des paramètres.
Et ne t'inquiètes pas, c'est pas pour des noms de fichiers que j'ai besoin d'espace dans mes paramètres ... ;-). C'est pour autre chose (un truc vachement important et secret alors ...).
Merci de votre aide et @ plus.
Et ne t'inquiètes pas, c'est pas pour des noms de fichiers que j'ai besoin d'espace dans mes paramètres ... ;-). C'est pour autre chose (un truc vachement important et secret alors ...).
Merci de votre aide et @ plus.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 663
>
Magicjibus
7 avril 2003 à 11:25
7 avril 2003 à 11:25
ok :-)
En fait getopt est également très utile pour récupérer correctement les noms de fichiers passés en ligne de commande
(il débrouille bien en particulier sur les chaînes quotées
ex: python monprogramme.py "mon fichier1.doc" "mon fichier2.txt")
En fait getopt est également très utile pour récupérer correctement les noms de fichiers passés en ligne de commande
(il débrouille bien en particulier sur les chaînes quotées
ex: python monprogramme.py "mon fichier1.doc" "mon fichier2.txt")
Arg, j'ai le meme probleme que Magicjibus, quelques années après..
Ta solution me parait parfaite sebsauvage, mais je n'arrive pas a utiliser getopt pour faire cela.
Pourrait tu m'indiquer les quelques lignes de code pour récuperer mon parametre
ex : python monprogramme.py "mon parametre1" "mon parametre2"
Merci.
Ta solution me parait parfaite sebsauvage, mais je n'arrive pas a utiliser getopt pour faire cela.
Pourrait tu m'indiquer les quelques lignes de code pour récuperer mon parametre
ex : python monprogramme.py "mon parametre1" "mon parametre2"
Merci.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 663
12 déc. 2006 à 17:47
12 déc. 2006 à 17:47
Exemples complets avec getopt et optparse:
https://www.sebsauvage.net/python/snyppets/#parsing_cmdline
https://www.sebsauvage.net/python/snyppets/#parsing_cmdline
Merci pour cette explication tres claire sebsauvage.
Mais dans tous les cas (utilisation de sys.argv[], getopt ou optparse), mon parametre entre quote est decoupé en deux parametre :
"mon , et parametre"
Comment faire pour que tout ce qui est entre quotes soit conservé, ou quel caractere peut etre utilisé pour remplacer cet espace.
Mon but est en fait de passer une string utilisé en java, en parametre d'un appel a un script python.
Merci pour votre aide.
Mais dans tous les cas (utilisation de sys.argv[], getopt ou optparse), mon parametre entre quote est decoupé en deux parametre :
"mon , et parametre"
Comment faire pour que tout ce qui est entre quotes soit conservé, ou quel caractere peut etre utilisé pour remplacer cet espace.
Mon but est en fait de passer une string utilisé en java, en parametre d'un appel a un script python.
Merci pour votre aide.
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 663
14 déc. 2006 à 21:00
14 déc. 2006 à 21:00
Tiens bizarre chez moi ça marche.
Exemple:
Et je l'appelle:
Il me prend bien mes chaînes entre doubles-quotes.
Exemple:
import optparse parser = optparse.OptionParser() (options, args) = parser.parse_args() print args
Et je l'appelle:
c:\data>python a.py "rcefce dcdc" "ba ba" ['rcefce dcdc', 'ba ba']
Il me prend bien mes chaînes entre doubles-quotes.
Ok. Merci sebsauvage.
En fait j'ai réussi a le faire marcher en ligne de commande, tu as raison, j'ai ce que je voulai..
Mais lorsque j'appel avec mon code java :
ou cmd est ma ligne de commande :
La seule reponse que j'obtien est :
C'est bizare que le comportement ne soit pas le meme dans le terminal et dans mon programme java..
Je vais essayer de chercher encore.
Si quelqu'un peut m'aider.. merci
En fait j'ai réussi a le faire marcher en ligne de commande, tu as raison, j'ai ce que je voulai..
Mais lorsque j'appel avec mon code java :
Process p = Runtime.getRuntime().exec(cmd)
ou cmd est ma ligne de commande :
String cmd = "python script.py \"deux mots\"";
La seule reponse que j'obtien est :
['"deux', 'mots"']
C'est bizare que le comportement ne soit pas le meme dans le terminal et dans mon programme java..
Je vais essayer de chercher encore.
Si quelqu'un peut m'aider.. merci
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 663
15 déc. 2006 à 10:51
15 déc. 2006 à 10:51
Voilà l'explication:
Quand tu fais exec() tu demande l'OS de lancer le programme. Mais ça ne passe pas par l'interpréteur de commande (cmd.exe) comme quand on le fait dans un fenêtre MS-Dos.
Il faut donc faire:
cmd = "cmd.exe /c python a.py \"deux mots\"";
Et là ça marchera.
(On lance l'interpréteur de command cmd et on lui demande de lancer le programme.)
Attention: ça ne marchera que sous Windows NT/2000/XP/2003, pas sous les autres OS (95/98/ME, Linux...)
Quand tu fais exec() tu demande l'OS de lancer le programme. Mais ça ne passe pas par l'interpréteur de commande (cmd.exe) comme quand on le fait dans un fenêtre MS-Dos.
Il faut donc faire:
cmd = "cmd.exe /c python a.py \"deux mots\"";
Et là ça marchera.
(On lance l'interpréteur de command cmd et on lui demande de lancer le programme.)
Attention: ça ne marchera que sous Windows NT/2000/XP/2003, pas sous les autres OS (95/98/ME, Linux...)
J'ai également ce problème d'espace mais je suis sous Linux et les caractères \ ne règlent pas le problème.
De mon côté, j'ai un script shell (ayant ses propres arguments) qui appelle un programme python :
python mon_prog.py $*
Un affichage de $* me donne bien la chaîne voulu : -a "app yo" -d des -o pp
mais par contre le programme python considère qu'il reçoit les arguments suivants :
argv = ['mon_prog.py', '-a', '"app', 'yo"', '-d', 'des', '-o', 'pp']
par contre quand je tape directement dans un terminal python mon_prog.py -a "app yo" -d des -o pp, aucun problème.
Une idée comment résoudre ce problème sous Linux ?
De mon côté, j'ai un script shell (ayant ses propres arguments) qui appelle un programme python :
python mon_prog.py $*
Un affichage de $* me donne bien la chaîne voulu : -a "app yo" -d des -o pp
mais par contre le programme python considère qu'il reçoit les arguments suivants :
argv = ['mon_prog.py', '-a', '"app', 'yo"', '-d', 'des', '-o', 'pp']
par contre quand je tape directement dans un terminal python mon_prog.py -a "app yo" -d des -o pp, aucun problème.
Une idée comment résoudre ce problème sous Linux ?
keujmat
Messages postés
32
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
30 mai 2013
5
>
thalie
15 juil. 2009 à 11:33
15 juil. 2009 à 11:33
As-tu réussi à résoudre ce problème? Je suis dans le même cas j'ai essayé pas mal de truc et je trouve toujours pas une solution adequat.
Merci
Merci
sebsauvage
Messages postés
32893
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 663
>
keujmat
Messages postés
32
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
30 mai 2013
15 juil. 2009 à 14:36
15 juil. 2009 à 14:36
Il ne faut pas lire argv directement, c'est trop délicat.
Utilisez le module optparse qui est spécialisé pour extraire les infos de la ligne de commande.
Il gère tous les cas particuliers.
J'ai mis des exemples là:
https://sebsauvage.net/python/snyppets/index.html#parsing_cmdline_optparse
Utilisez le module optparse qui est spécialisé pour extraire les infos de la ligne de commande.
Il gère tous les cas particuliers.
J'ai mis des exemples là:
https://sebsauvage.net/python/snyppets/index.html#parsing_cmdline_optparse
Ah ok, je vois le truc, pas bete !
Le dernier probleme est que je développe sur Mac, depuis peu, donc je suis pas très habitué à l'environnement.
Mais je pense arriver a trouver un équivalent.
Merci bien
Le dernier probleme est que je développe sur Mac, depuis peu, donc je suis pas très habitué à l'environnement.
Mais je pense arriver a trouver un équivalent.
Merci bien
Salut!
Il faut faire ceci:
skami@skami-laptop:~/$python essay.py mdr ça\ marche\ avec\ ce\ système!
1ère option:
mdr
2ème option:
ça marche avec ce système!
Quand on passe des argument il faut TOUJOURS remplacer les " " par des "\ "!
C'est une des premières chose qu'on apprends :-°
contenu de essay.py:
#!/usr/bin/python
# -*- coding:Utf-8 -*-
import optparse
parser = optparse.OptionParser()
(options, args) = parser.parse_args()
print "1ère option:"
print "\t"+args[0]
print "2ème option:"
print '\t'+args[1]
Il faut faire ceci:
skami@skami-laptop:~/$python essay.py mdr ça\ marche\ avec\ ce\ système!
1ère option:
mdr
2ème option:
ça marche avec ce système!
Quand on passe des argument il faut TOUJOURS remplacer les " " par des "\ "!
C'est une des premières chose qu'on apprends :-°
contenu de essay.py:
#!/usr/bin/python
# -*- coding:Utf-8 -*-
import optparse
parser = optparse.OptionParser()
(options, args) = parser.parse_args()
print "1ère option:"
print "\t"+args[0]
print "2ème option:"
print '\t'+args[1]
7 avril 2003 à 09:55
Pour l'instant, j'ai développé une bidouille interne au script python qui interprète le contenu des variables pour les recomposer si besoin, mais cela n'est pas fiable à 100%, alors si quelqu'un a une solution ...
Magicjibus
Merci quand même de cette contribution