IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

problèmes avec les quotes et les accolades dans Runtime.exec


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut problèmes avec les quotes et les accolades dans Runtime.exec
    Bonjour,

    j'essaie d'executer la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F "|" '{print $1,$2}' /home/lala/file
    via "Runtime.getRuntime().exec(String)" ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRuntime().exec("awk -F \"|\" '{print $1,$2}' /home/lala/file")
    et ce qui me retourne sur le flux d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk: 1: unexpected character '''
    awk: line 2: missing } near end of file
    Quelqu'un sait-il d'où peut venir le problème ?

  2. #2
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    pour passer tes paramètres il vaut mieux utiliser un tableau ... c'est expliqué dans la FAQ que tu sûrement lu il me semble
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    ok pardon...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    J'ai changé en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRuntime().exec(new String[]{"awk", "-F", "\"|\"", "'{print $1,$2}'", "/home/lala/file"})
    il n'y a plus d'erreur, mais rien n'est retourné. Ce qui veut probablement dire que awk ne trouve pas l'action print. Au secours !

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par yarf
    il n'y a plus d'erreur, mais rien n'est retourné.
    Que veux-tu dire par "rien n'est retourné" ???

    Tu lis bien les flux de sortie au moins ? (et dans des threads séparés)

    Si ce n'est pas le cas une recherche sur le forum s'impose ! Il y a de nombreux sujets sur le problème...

    a++

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    Ce que je veux dire par rien n'est retourné. Voilà le code en simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Process p = Runtime.getRuntime().exec(new String[]{"awk", "-F", "\"|\"", "'{print $1,$2}'", "/home/lala/file1"});
    new Thread(){
        public void run() {
    	InputStream is = p.getInputStream();
    	PrintStream ps = new PrintStream(new FileOutputStream("/home/lala/file2"));
    	int lala;
    	while((lala = is.read()) != -1) {
    	    ps.write(lala);
    	    System.out.print(lala);
    	}
    	is.close();
    	ps.close();
        }
    }.start();
    Une fois le programme executé, le fichier file2 est vide et rien n'est affiché sur la sortie standard.

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yarf
    Une fois le programme executé, le fichier file2 est vide et rien n'est affiché sur la sortie standard.
    En même temps tu ne lis pas le flux d'erreur (getErrorStream()) donc tu ne peux pas voir les erreurs de "awk"...

    a++

    PS : Si tu utilises Java 5.0, tu peux utiliser la classe ProcessBuilder à la place de Runtime.exec(). Cette dernière permet de fusionner les flux stdout et stderr dans un même flux (avec la méthode redirectErrorStream()). Cela peut simplifier le traitement (et évites l'utilisation des threads) si tu n'as pas besoin de cette séparation...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    Dans le code entier j'ai aussi la lecture du flux d'erreur et il est vide lui aussi. Je ne l'ai pas mis pour simplifier. Je vais tester avec ProcessBuilder on sait jamais.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    Bon... Ca n'a rien donné de mieux...

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    C'est bizarre que tu n'obtiennes ni erreur ni résultat...

    Essayes toujours de fermer le flux d'entrée (c'est toujours mieux de le faire surtout si on ne l'utilise pas).


    Sinon j'ai remarqué un autre "problème" : les quotes sont normalement gérer par le shell, et ne sont pas passé au programme. Donc tu ne devrais pas les passer en paramètre (ici les paramètres sont passé tel quel) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process p = Runtime.getRuntime().exec(new String[]{"awk", "-F", "|", "{print $1,$2}", "/home/lala/file1"})
    a++

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    Je crois avoir trouvé d'où vient le problème. Runtime.exec() a l'air de bien fonctionner pour les "petits" programmes, mais pas s'ils durent trop longtemps ; et le temps d'exécution de ma commande est environ d'une minute trente. Donc le problème serait que l'exec n'est pas terminé au moment de la lecture du flux et donc rien n'est retourné. Malheureusement je n'arrive pas à le faire attendre la fin de l'exécution... J'ai testé tous les wait, waitFor, getValue, etc. avec des while sans succès (boucles infinies).

    Pour les quotes, c'est propre à awk : il applique l'action entre quotes au fichier en paramètre.

    Sinon le problème peut venir justement de cette spécificité (ce serait donc le "print ..." qui poserait problème)

  12. #12
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yarf
    Je crois avoir trouvé d'où vient le problème. Runtime.exec() a l'air de bien fonctionner pour les "petits" programmes, mais pas s'ils durent trop longtemps ;
    Runtime.exec() fonctionne tout à fait correctement !!! On pourrait voir ton code complet !

    Citation Envoyé par yarf
    Pour les quotes, c'est propre à awk : il applique l'action entre quotes au fichier en paramètre.
    Non : les quotes sont propre au shell, et permettent de protéger certains caractères ou d'éviter de découper certaine chaine.

    Si dans ton shell tu remplaces awk par echo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo -F "|" '{print $1,$2}' /home/lala/file1
    Tu obtiendras ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -F | {print $1,$2} /home/lala/file1
    Ce qui prouve que les quotes ne sont pas passé au programme...

    a++

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    ok pour les quotes, je disais ça parce qu'ils sont présents dans la description même de la syntaxe d'awk (dans le man) et je ne savais pas qu'ils étaient spécifiques au shell.

    Pour Runtime.exec() je ne fais que répéter les dires de Michael C. Daconta. La méthode fonctionne bien sûr, en ce sens qu'elle exécute effectivement la commande en paramètre. Le problème que j'ai envisagé, c'est l'attente de la fin de l'exécution du processus. Donc si le processus a eu le temps de se terminer, tout se passe bien, sinon il faut trouver un moyen d'attendre. Et bien sûr je ne prétends pas énoncer une vérité irréfutable, je te signale que j'ai bien pris soin d'utiliser le conditionnel ! Pour ce qui est de mettre mon code, en gros à part les try catch en plus et le traitement du flux d'erreur c'est le même que celui du message plus haut.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    Ah si je savais pour les quotes !

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Points : 57
    Points
    57
    Par défaut
    BON !

    J'ai viré les quotes et les guillemets en trop et ... ça marche... J'ai bien fait d'utiliser le conditionnel !!!

  16. #16
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yarf
    ok pour les quotes, je disais ça parce qu'ils sont présents dans la description même de la syntaxe d'awk (dans le man) et je ne savais pas qu'ils étaient spécifiques au shell.
    C'est normal que ce soit indiqué dans le manuel puisque awk est fait pour être utilisé par le shell...

    Citation Envoyé par yarf
    Pour Runtime.exec() je ne fais que répéter les dires de Michael C. Daconta. La méthode fonctionne bien sûr, en ce sens qu'elle exécute effectivement la commande en paramètre.
    Je ne vois pas vraiment où il dit cela exactement ? Il indique par contre qu'il faut consommer les flux (entre autres) :
    To sum up, follow these rules of thumb to avoid the pitfalls in Runtime.exec():

    1. You cannot obtain an exit status from an external process until it has exited
    2. You must immediately handle the input, output, and error streams from your spawned external process
    3. You must use Runtime.exec() to execute programs
    4. You cannot use Runtime.exec() like a command line

    Citation Envoyé par yarf
    Le problème que j'ai envisagé, c'est l'attente de la fin de l'exécution du processus. Donc si le processus a eu le temps de se terminer, tout se passe bien, sinon il faut trouver un moyen d'attendre.
    Pourtant waitFor() permet exactement cela...

    Citation Envoyé par yarf
    Et bien sûr je ne prétends pas énoncer une vérité irréfutable, je te signale que j'ai bien pris soin d'utiliser le conditionnel !
    Et je te signale juste que le problème ne vient pas de Runtime.exec()... je l'ai déjà utilisé plusieurs fois, et même avec des programmes important (que ce soit en temps de traitement ou en volume de données).

    Citation Envoyé par yarf
    Pour ce qui est de mettre mon code, en gros à part les try catch en plus et le traitement du flux d'erreur c'est le même que celui du message plus haut.
    Mais pourquoi ne veux-tu pas le donner ? Comment pourrait-on trouver l'erreur avec des bribes de codes et sans message d'erreur ???

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/11/2014, 11h57
  2. Réponses: 9
    Dernier message: 09/12/2008, 01h07
  3. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 16h59
  4. problème avec strtok pour récupérer les vides
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 02/06/2005, 21h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo