Rechercher : dans
Par :

Probleme passage d'argument shell unix -> py

Dernière réponse le 15 jui 2009 à 14:36:53 Magicjibus, le 4 avr 2003 à 10:29:21 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Probleme passage d'argument shell unix > py » dans :
Exécuter un script shell VoirExécution d'un script Pour pouvoir exécuter un script ou un programme en ligne de commande il y a plusieurs possibilités : 1. Le chemin absolu 2. Le chemin relatif 3. Modifier la variable PATH Note: Le Sha...
Télécharger CygWin VoirCygwin est un environnement UNIX pour Windows composé: d'un shell Unix d'une librairie dynamique (DLL) chargée de fournir une couche d'émulation Unix pour le système Windows d'un ensemble de librairies, sources et exécutables adaptés à Cygwin...
Systèmes UNIX - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire entre le système...
Introduction aux systèmes UNIX VoirLe système UNIX Le système Unix est un système d'exploitation multi-utilisateurs, multi-tâches, ce qui signifie qu'il permet à un ordinateur mono ou multi-processeurs de faire exécuter simultanément plusieurs programmes par un ou plusieurs...
Sécurité - Méthodologie d'une intrusion sur un réseau VoirCet article a pour but d'expliquer la méthodologie généralement retenue par les pirates pour s'introduire dans un système informatique. Il ne vise pas à expliquer comment compromettre un système mais à comprendre la façon dont il peut l'être afin de...

1

zigou, le 4 avr 2003 à 15:39:26

Faut pas mettre printf au lieu de print ?

Répondre à zigou

3

Magicjibus, le 7 avr 2003 à 09:55:38

Le problème ne vient pas du print (ou du printf qui n'existe pas à a conaissance en python) mais du contenu des variables, c'est à dire de l'interprétation des variables passées par le shell au scrit python.

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

Répondre à Magicjibus

2

Kuching, le 5 avr 2003 à 03:49:57

Salut,

Le spécialiste Python du forum c'est SebSauvage ... devrait pas tarder.

A+  K.
It's going down ...

Répondre à Kuching

4

sebsauvage, le 7 avr 2003 à 10:34:42

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.

Répondre à sebsauvage

5

sebsauvage, le 7 avr 2003 à 10:35:44

Ah oui tant que j'y pense:

Unix ne supporte pas les noms de fichiers comportant des espaces :)

Répondre à sebsauvage

6

Magicjibus, le 7 avr 2003 à 10:59:17

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.

Répondre à Magicjibus

7

sebsauvage, le 7 avr 2003 à 11:25:54

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")

Répondre à sebsauvage

8

mar9, le 12 déc 2006 à 17:13:06

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.

Répondre à mar9

9

sebsauvage, le 12 déc 2006 à 17:47:14

Exemples complets avec getopt et optparse:
http://www.sebsauvage.net/python/snyppets/#parsing_cmdline
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++

Répondre à sebsauvage

10

Mar9, le 14 déc 2006 à 17:28:27

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.

Répondre à Mar9

11

sebsauvage, le 14 déc 2006 à 21:00:32

Tiens bizarre chez moi ça marche.

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.
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++

Répondre à sebsauvage

12

mar9, le 15 déc 2006 à 10:02:46

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 :

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

Répondre à mar9

13

sebsauvage, le 15 déc 2006 à 10:51:36

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...)
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++

Répondre à sebsauvage

15

thalie, le 23 déc 2008 à 11:53:58
  • +1

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 ?

Répondre à thalie

17

keujmat, le 15 jui 2009 à 11:33:03

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

Répondre à keujmat

18

 sebsauvage, le 15 jui 2009 à 14:36:53

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à:
http://sebsauvage.net/python/snyppets/index.html#parsing_cmd­line_optparse

Répondre à sebsauvage

14

mar9, le 15 déc 2006 à 14:28:06

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

Répondre à mar9

16

Skami, le 1 mai 2009 à 15:00:30

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]

Répondre à Skami
Collection CommentÇaMarche.net