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

  1. #1
    Membre à l'essai
    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
    Points : 23
    Points
    23
    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 557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Pourquoi n'as-tu séparé que le "-c" des autres paramètres ? Des paramètres c'est des paramètres.

  3. #3
    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 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 557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    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.

  5. #5
    Membre à l'essai
    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
    Points : 23
    Points
    23
    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 sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    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 à l'essai
    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
    Points : 23
    Points
    23
    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

  8. #8
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    /bin/sh n'est pas nécessairement bash
    le bashrc n'est exécuté que pour les bash (et seulement en mode interactif, il me semble). Je suppose que ton application java est lancée depuis ton ide, qui lui même est lancé depuis ton interface graphique? Dans ce cas, a aucun moment bash n'est lancé, car aucun de ces éléments n'a besoin d'un shell.

  9. #9
    Membre à l'essai
    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
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    /bin/sh n'est pas nécessairement bash
    le bashrc n'est exécuté que pour les bash (et seulement en mode interactif, il me semble). Je suppose que ton application java est lancée depuis ton ide, qui lui même est lancé depuis ton interface graphique? Dans ce cas, a aucun moment bash n'est lancé, car aucun de ces éléments n'a besoin d'un shell.
    ta parfaitement raison au début j'avais penser a çà mais le problème venait des paramètre et des espaces entre les guillemets.
    NB: éviter les espaces
    la solution est la suivante :
    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
    21
    22
    23
    24
    25
    26
    27
    28
     
    public class Conversion_xyz2grd {
    	public static void main(String[] args) throws IOException,
    			InterruptedException {
    		ProcessBuilder builder = new ProcessBuilder( 
    				"/usr/lib/gmt/bin/xyz2grd","/manche02_1630.xyz","-Ggmt/gmt_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();
    		}
     
    	}
    }
    Merci de vos conseils et ta compréhension . J espère que ça va servir à d' autres personnes.

+ 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