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

Java Discussion :

Lancer un programme externe avec paramètres


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 28
    Par défaut Lancer un programme externe avec paramètres
    Bonjour j ai un probleme avec GMT , en effet lorsque je lance la commande:
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5
    il me cree le fichier gmt_manche_02.grd mais si le l execute via une classe java j'obtiens rien
    voici la classe java

    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
    16
    public class Test {
    public static void main(String[] args) throws IOException, InterruptedException {
     
    		Runtime runtime = Runtime.getRuntime();
    		System.out.println("Début du programme");
            try {	Process p=runtime.exec(new String[]{"/bin/sh", "-c", "xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5"}); 
     
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("Fin du programme");
        }
     
     
     
    }
    quelque peut me venir en aide svp ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Pourquoi n'as-tu séparé que le "-c" des autres paramètres ? Des paramètres c'est des paramètres.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par thelvin Voir le message
    Pourquoi n'as-tu séparé que le "-c" des autres paramètres ? Des paramètres c'est des paramètres.
    C'est normal.
    Lorsque tu utilises un shell, la ligne de commande peut être passé en un seul et unique paramètre (c'est même mieux en fait dans ce cas, car tu peux passer exactement la même chose que tu tapes en ligne de commande).




    @ddiop : le problème vient sûrement du fait que tu ne traites pas les flux du process.
    Du coup tu ne peux pas voir une éventuelle erreur.
    Pire : ces flux utilisent de petit buffer qui pourraient se remplir et bloquer la commande !


    Il faut lire les flux (et en parallèle sinon il peut encore y avoir des risque de blocage), ou fermer ceux qu'on ne va pas utiliser (comme stdin dans la plupart des cas)





    Si tu tournes sous Java 5 ou plus, je te conseillerais plutôt d'utiliser ProcessBuilder à la place de Runtime, car il te permet de fusionner les flux stdout/stderr (ce qui fait qu'il n'y a qu'un seul flux à lire).
    Par exemple ici en sortant le tout sur la console :
    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
    16
    17
    18
    19
    20
    	ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5")
    		.redirectErrorStream(true);
     
    	Process process = builder.start();
    	// On ferme le flux inutilisé (stdin)
    	process.getOutputStream().close();
    	// On lit de sortie du process (stdout)
    	// ainsi que le flux d'erreur (stderr)
    	// qui a été redirigé dans le même flux via redirectErrorStream() :
    	InputStream input = process.getInputStream();
    	try {
    		byte[] buf = new byte[512];
    		int len;
    		while ( (len=input.read(buf)) > 0 ) {
    			System.out.write(buf, 0, len);
    		}
    		System.out.flush();
    	} finally {
    		input.close();
    	}




    A partir de Java 7 tu as même des fonctionnalités plus poussé, comme le fait d'hériter automatiquement des flux du process Java.
    Par exemple ici les flux stdin/stdout/stderr de la commande seront les mêmes que ceux du programme Java. Il n'y a donc rien à faire de plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	new ProcessBuilder("/bin/sh", "-c", "xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5")
    		.inheritIO()
    		.start();

    Ou même de rediriger automatiquement un (ou plusieurs flux) dans des fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	new ProcessBuilder("/bin/sh", "-c", "xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5")
    		.inheritIO()
    		.redirectError(new File("error.log"))
    		.start();


    a++

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    C'est normal.
    Lorsque tu utilises un shell, la ligne de commande peut être passé en un seul et unique paramètre (c'est même mieux en fait dans ce cas, car tu peux passer exactement la même chose que tu tapes en ligne de commande).
    Effectivement, j'avais mal lu. Au temps pour moi.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 28
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    C'est normal.
    Lorsque tu utilises un shell, la ligne de commande peut être passé en un seul et unique paramètre (c'est même mieux en fait dans ce cas, car tu peux passer exactement la même chose que tu tapes en ligne de commande).




    @ddiop : le problème vient sûrement du fait que tu ne traites pas les flux du process.
    Du coup tu ne peux pas voir une éventuelle erreur.
    Pire : ces flux utilisent de petit buffer qui pourraient se remplir et bloquer la commande !


    Il faut lire les flux (et en parallèle sinon il peut encore y avoir des risque de blocage), ou fermer ceux qu'on ne va pas utiliser (comme stdin dans la plupart des cas)





    Si tu tournes sous Java 5 ou plus, je te conseillerais plutôt d'utiliser ProcessBuilder à la place de Runtime, car il te permet de fusionner les flux stdout/stderr (ce qui fait qu'il n'y a qu'un seul flux à lire).
    Par exemple ici en sortant le tout sur la console :
    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
    16
    17
    18
    19
    20
    	ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", "xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5")
    		.redirectErrorStream(true);
     
    	Process process = builder.start();
    	// On ferme le flux inutilisé (stdin)
    	process.getOutputStream().close();
    	// On lit de sortie du process (stdout)
    	// ainsi que le flux d'erreur (stderr)
    	// qui a été redirigé dans le même flux via redirectErrorStream() :
    	InputStream input = process.getInputStream();
    	try {
    		byte[] buf = new byte[512];
    		int len;
    		while ( (len=input.read(buf)) > 0 ) {
    			System.out.write(buf, 0, len);
    		}
    		System.out.flush();
    	} finally {
    		input.close();
    	}




    A partir de Java 7 tu as même des fonctionnalités plus poussé, comme le fait d'hériter automatiquement des flux du process Java.
    Par exemple ici les flux stdin/stdout/stderr de la commande seront les mêmes que ceux du programme Java. Il n'y a donc rien à faire de plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	new ProcessBuilder("/bin/sh", "-c", "xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5")
    		.inheritIO()
    		.start();

    Ou même de rediriger automatiquement un (ou plusieurs flux) dans des fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	new ProcessBuilder("/bin/sh", "-c", "xyz2grd manche02_1630.xyz -Ggmt_manche_02.grd -I2m -R-7/2/47.5/51.5")
    		.inheritIO()
    		.redirectError(new File("error.log"))
    		.start();


    a++
    j'ai utilise ce code mais il me retourne /bin/sh: xyz2grd: not found.
    parcontre si j'utilise Runtime il me sort pas d'erreur mais j'ai toujour pas le fichier gmt_manche_02.grd.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    xyz2grd: not found.
    Donc tu sais ce qui te reste à corriger, xyz2grd n'est pas dans le path de ta machine.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 28
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Donc tu sais ce qui te reste à corriger, xyz2grd n'est pas dans le path de ta machine.

    lors de l'installation de MGM j'ai changer rajouter dans le .bashrc]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    export NETCDFHOME=/usr/lib
    export GMTHOME=/usr/lib/gmt
    export PATH=$PATH:$GMTHOME/bin
    donc si ça marche pour certains commandes de GMT je vois pas pourquoi ça ne marche pas pour la commande xyz2grd

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

Discussions similaires

  1. [Batch] Lancer programme python avec paramètre
    Par bastou93 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 07/07/2011, 07h58
  2. Réponses: 3
    Dernier message: 07/08/2008, 10h00
  3. Réponses: 3
    Dernier message: 23/05/2007, 16h09
  4. [Système] Lancer un programme externe depuis une page web
    Par needles94000 dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2006, 21h34
  5. lancer un programme externe et continuer
    Par seal3 dans le forum C++
    Réponses: 6
    Dernier message: 31/10/2005, 19h00

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