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

avec Java Discussion :

Exécuter commande système sous Windows en Java


Sujet :

avec Java

  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut Exécuter commande système sous Windows en Java
    Bonsoir, je cherche à faire une classe pouvant lancer des programmes divers (.py .exe etc etc).

    J'ai d'abord voulu tester une simple commande batch.

    A savoir la commande help du cmd.

    A l'exécution voilà ce que j'obtiens:

    Exécution de la commande:

    Microsoft Windows [version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation. Tous droits r‚serv‚s.
    Je retourne donc une erreur.

    Mais d'où vient elle je n'arrive pas à savoir...


    Voici le code complet

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
     
    //Allow to launch any system command
    public class Launch {
     
     
    private static BufferedReader getOutput(Process p) {
        return new BufferedReader(new InputStreamReader(p.getInputStream()));
    }
     
    private static BufferedReader getError(Process p) {
        return new BufferedReader(new InputStreamReader(p.getErrorStream()));
    }
    	private String command;
     
    	public String getCommand(){
    		return this.command;
    	}
     
    	public Launch(String com){
    		this.command=com;
    	}
     
    	//launch command using exec
    	public void exe(){
    		try {
    			String[] commande = {"cmd.exe",this.getCommand()};
    			System.out.println("Exécution de la commande:\n");
                Process p = Runtime.getRuntime().exec(commande);
                BufferedReader output = getOutput(p);
                BufferedReader error = getError(p);
                String ligne = "";
                while ((ligne = output.readLine()) != null) {
                    System.out.println(ligne);
                }
                System.out.println("En attente1:\n");
                while ((ligne = error.readLine()) != null) {
                    System.out.println(ligne);
                }
                System.out.println("En attente2:\n");
                p.waitFor();
    			System.out.println("Commande exécuté\n");
    		} catch (IOException e) {
    			System.out.println("La commande a échoué\n");
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			System.out.println("Echec wait for\n");
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
     
    	public static void main(String[] args) {
    		String com="help";
    		Launch test=new Launch(com);
    		test.exe();
    	}
    }
    En attente1 ne s'affiche pas, l'erreur est donc sur output.


    Merci à vous !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Premièrement, tu dois exécuter cmd.exe avec le paramètre /c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] commande = {"cmd.exe","/c",this.getCommand()};
    Ensuite, attention avec la lecture des flux : la lecture de l'un peut bloquer tout le process si rien n'est écrit dedans. Par exemple, si tu inverses la lecture de error et output dans ton cas, l'exécution sera bloquée en attente de quelque chose sur error qui n'arrivera jamais. Il faudrait threader les lectures des flux. Pour simplifier ça, il y a la classe ProcessBuilder.
    :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String[] commande = {"cmd.exe","/c",this.getCommand()};
    System.out.println("Exécution de la commande:\n");
     
    ProcessBuilder pb = new ProcessBuilder(commande);
    pb.redirectError(Redirect.INHERIT);
    pb.redirectOutput(Redirect.INHERIT);
    Process p = pb.start();
    System.out.println("En attente2:\n");
    p.waitFor();
    System.out.println("Commande exécuté\n");
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Salut, et merci pour ta réponse.

    Je n'ai pas testé, je ne pourrais regarder que demain, mais j'ai tout de même une question.

    Pourquoi faut-il rajouter "\c" ? Faudrait-il le rajouter si la commande système précédente n'était pas cmd.exe, mais un autre programme ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    C'est un paramètre de l'exécutable cmd.exe :

    [...]>cmd /?
    Démarre une nouvelle instance de l’interpréteur de commandes de Windows

    CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] chaîne]

    /C Exécute la commande donnée par la chaîne de caractères puis se termine.
    /K Exécute la commande donnée par la chaîne de caractères et reste actif.
    /S Modifie le traitement de la chaîne après /C ou /K (voir ci-dessous).
    /Q Exécute (sans interactions) la commande donnée puis reste actif.
    /D Désactive l’exécution d’AutoRun à partir du Registre (voir ci-dessous).
    /A Redirige la sortie de commandes internes vers un canal ou un fichier
    ANSI.
    /U Redirige la sortie de commandes internes vers un canal ou un fichier
    UNICODE.
    /T:fg Change la couleur du premier plan ou de l’arrière-plan (voir aussi
    COLOR /?).
    /E:ON Active les extensions de commande (voir ci-dessous).
    /E:OFF Désactive les extensions de commande (voir ci-dessous).
    /F:ON Active les caractères de fin des noms de fichiers et de répertoires
    (voir ci-dessous).
    /F:OFF Désactive les caractères de fin des noms de fichiers et de répertoires
    (voir ci-dessous).
    /V:ON Active l’expansion retardée des variables d’environnement en utilisant
    Appuyez sur une touche pour continuer...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    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
    Citation Envoyé par Amnael Voir le message
    Bonsoir, je cherche à faire une classe pouvant lancer des programmes divers (.py .exe etc etc).

    J'ai d'abord voulu tester une simple commande batch.

    A savoir la commande help du cmd.
    Joel a déjà corrigé ton code au dessus.
    Mauvais choix. Help est une commande interne du shell windows, pas un programme. Ce qui fait que tu dois la lancer en utilisant "cmd.exe", avec des paramètres particuliers pour qu'il n'affichage pas de fenêtre, ce que tu ne fera pas lorsque tu lancera d'autre programmes (cmd.exe en gros ça sert à quedalle dans 99% des cas). Si tu veux te faire la main, c'est plus représentatif de lancer de vrais programmes

    Citation Envoyé par Amnael Voir le message
    Faudrait-il le rajouter si la commande système précédente n'était pas cmd.exe, mais un autre programme ?
    non

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    D'accord merci à vous deux.


    Je me dois tout de même de préciser une chose, j'aimerais bien en testant ces commandes voir le shell de windows s'ouvrir et s'exécuter, car par la suite dans les programmes que j'utiliserais il y aura probablement des shell qui devront rester ouvert du style serveur par exemple.


    EN fait, je pensais presque utiliser cmd.exe pour lancer les programmes via du shell, mais d'après ce que vous me dîtes ce n'est pas la bonne méthode ? Si j'ai un fichier test.py; la fonction exec pourra lancer directement test.py sans ouvrir le cmd au préalable ?

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Bonjour,

    j'ai testé et ça marche parfaitement.

    Et si je met le path d'un fichier dans command, il s'ouvre bien, cela devrait donc marcher pour lancer un programme quelconque. Certes je passe par le batch mais finalement c'est pas un soucis vu que le projet est destiné à windows.

    Merci à vous !

  8. #8
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Salut, désolé je reviens vous embêtter avec ça.


    Tout a très bien marché jusqu'à présent lorsque je faisais mes tests en local sur Eclipse, mais depuis que je suis passé sur le serveur c'est un peu plus délicat.


    Ma première question c'est

    Est-ce que je peux rediriger le flux des erreurs vers ma fenêtre du genre jtextarea ? Si oui, comment ?

    Autre chose, lorsque je suis sur mon serveur et que, dans le cmd, je tape une commande (dans mon cas éxécuter un script python), j'ai un résultat qui s'affiche dans la console, mais lorsque je le fais depuis mon script java, rien ne s'affiche, et je n'arrive pas à savoir si cela vient d'une erreur ou pas...ce qui est sûr c'est que je voudrais suivre l'exécution de la commande dans la console (et pas celle d'éclipse^^)



    En gros, si je fais dans le cmd

    python \\100.100.100.100\C\rep\helloworld.py

    J'ai un résultat dans le cmd qui s'affiche.

    Mais si j'essaie de lancer depuis java, je n'ai plus rien

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    public class Launch {
     
    	/*can be absolute pathfile*/
    	private String command;
    	private FTextArea fenetreTexte;
     
    	public String getCommand(){
    		return this.command;
    	}
     
    	public Launch(String com,FTextArea fen){
    		this.command=com;
    		this.fenetreTexte=fen;
    	}
     
    	//launch batch command using exec
    	public void exe(){
    		try {
    			String[] commande = {"cmd.exe","/c","cd C:\\simu && "+this.getCommand()};
    			System.out.println("Exécution de la commande:"+this.getCommand()+"\n");
    			this.fenetreTexte.addext("Exécution de la commande:"+this.getCommand()+"\n");
    			ProcessBuilder pb = new ProcessBuilder(commande);
    			pb.redirectError(Redirect.INHERIT);
    			pb.redirectOutput(Redirect.INHERIT);
    			Process p = pb.start();
    			System.out.println("En attente:\n");
    			p.waitFor();
    			System.out.println("Commande exécutée\n");
    			this.fenetreTexte.addext("Commande exécutée\n");
    		} catch (IOException e) {
    			System.out.println("La commande a échoué\n");
    			this.fenetreTexte.addext("Commande a échoué\n");
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			System.out.println("Echec wait for\n");
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    A noter que sur cette ligne, j'ai voulu me déplacer dans un répertoire avant d'exécuter la commande, mais je ne sais même pas si c'est correct

    String[] commande = {"cmd.exe","/c","cd C:\\simu && "+this.getCommand()};

    Et du coup, pour lancer la commande je vais faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String com="python \\\\100.100.100.100\\C\\simu\\helloworld.py";
    		FTextArea f=new FTextArea(); //ma jtextarea
    		Launch l=new Launch(com,f);
    		l.exe();

  9. #9
    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
    serveur <=> JTextArea

    pas compatible, par définition, un serveur, ça n'a en général pas d'écran, on peux s'y connecter avec un shell distant qui n'a que du texte. Donc essaie d'éviter les composants graphiques pour une appli serveur.

    Héritage de flux:
    Ca ne te sert à rien avec cmd.exe, il n'exporte pas de flux à ma connaissance, il a sa propre fenêtre. Qui dit fenêtre dit: pas sur un serveur si possible (ouais je sais windows c'est un peu particulier).

    Changer de dossier: process a un paramètre pour préciser le dossier d'exécution, utilise le plutot que d'essayer de passer par des voies détournées


    java sous windows: si tu veux voir stdin et stdout sous windows en java, fait attention que sous windows il y a deux process java: java.exe et javaw.exe. Un seul des deux à des flux standards: java.exe


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    			String[] commande = {"python", "helloworld.py"};
    			System.out.println("Exécution de la commande");
    			Process p = new ProcessBuilder(commande)
    				.directory(new File("C:\\simu"))
    				.redirectError(Redirect.INHERIT)
    				.redirectOutput(Redirect.INHERIT)
    				.start();
    			System.out.println("En attente:");
    			p.waitFor();
    			System.out.println("Commande exécutée");

  10. #10
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Salut, et merci, je vais essayer ta méthode.

    Pour ce qui est de la JTextArea elle reste locale je te rassure =)
    J'aurais simplement aimé que lorsque j'exécute un script python distant je puisse voir les résultats (dans la jtext area c'était une proposition, mais si ça le fait dans le cmd ça me va très bien, je préfère même...sauf que pour le moment, si je veux lancer mon helloword du serveur distant depuis java, je ne vois rien s'exécuter...

  11. #11
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    J'ai rajouté quelques print dans ma jtextarea et le résultat est sans équivoque.

    Je n'ai aucun aperçu de l'exécution.

    En gros, là dans ma jtext area il m'affiche qu'il exécute la commande .... En attente...Commande exécuté.

    Ce qui est normal, mais en arrière plan, le script lui ne s'exécute pas.


    Pour vérifier ça j'ai rajouté un raw_input dans le scipt python de façon à ce qu'il se termine pas avant que l'user tape sur son clavier. Et là dans ma fenêtre je vois bien que je reste sur en attente et donc que le process tourne bien; sauf que je ne vois pas son exécution ! Je comprends pas pourquoi quand je lance un .py en mode console je vois l'exécution dans la console, et pourquoi lorsque je le lance depuis une appli java je ne vois rien de l'exécution du script....

    J'ai l'impression que le problème vient des redirect du process builder. (Etant donné que sous éclipse il m'affichait bien les résultats).

  12. #12
    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
    tu peux monter ton code corrigé? Montrer comment tu a lancé ton programme?

  13. #13
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Le voici j'ai pas changé le nom mais du coup command, ça devient le nom du fichier à exécuter.

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class Launch {
     
    	/*can be absolute pathfile*/
    	private String command;
    	private FTextArea fenetreTexte;
     
    	public String getCommand(){
    		return this.command;
    	}
     
    	public Launch(String com,FTextArea fen){
    		this.command=com;
    		this.fenetreTexte=fen;
    	}
     
    	//launch batch command using exec
    	public void exe(){
    		try {
    			String[] commande = {"python",this.getCommand()};
    			this.fenetreTexte.addext("Exécution de la commande:"+this.getCommand()+"\n");
    			ProcessBuilder pb = new ProcessBuilder(commande);
    			pb.directory(new File("C:\\simu"));
    			pb.redirectError(Redirect.INHERIT);
    			pb.redirectOutput(Redirect.INHERIT);
    			Process p = pb.start();
    			this.fenetreTexte.addext("En attente\n");
    			p.waitFor();
    			this.fenetreTexte.addext("Commande exécutée\n");
    		} catch (IOException e) {
    			this.fenetreTexte.addext("Commande a échoué\n");
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			this.fenetreTexte.addext("Echec wait for\n");
    			System.out.println("Echec wait for\n");
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
     
    	//test
    	public static void main(String[] args) {
    		FTextArea f=new FTextArea();
    		Launch test=new Launch("\\\\192.168.35.249\\C\\Users\\admin\\Desktop\\test.py",f);
    		test.exe();
    	}
     
     
    }

  14. #14
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Solution de secours.

    J'ai créé un .bat local qui lance le python distant. Et miracle, j'ai un cmd qui apparait !

    Ça m'ennuie d'être obligé de lancer un .bat qui ne fait que lancer un .py...mais au moins je peux avoir une trace et avancer =)

  15. #15
    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 Amnael Voir le message
    Pour vérifier ça j'ai rajouté un raw_input dans le scipt python de façon à ce qu'il se termine pas avant que l'user tape sur son clavier. Et là dans ma fenêtre je vois bien que je reste sur en attente et donc que le process tourne bien; sauf que je ne vois pas son exécution ! Je comprends pas pourquoi quand je lance un .py en mode console je vois l'exécution dans la console, et pourquoi lorsque je le lance depuis une appli java je ne vois rien de l'exécution du script....
    Si ton process python attend un saisie clavier, il faut que tu lui envoi à un moment donné sinon il va bloquer indéfiniment.

    or tu ne traites pas le flux d'entrée de ton process.
    Il faut toujours traiter tous les flux !!!


    Remplaces les "redirect()" par un seul pb.inheritIO() qui va associer tous les flux (stdin, stdout et stderr) à la console...



    a++

  16. #16
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    La doc dit pourtant que

    pb.redirectError(Redirect.INHERIT);
    pb.redirectOutput(Redirect.INHERIT);

    est équivalent à pb.inheritIO()

  17. #17
    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
    Non elle dit que c'est équivalent à faire cela sur les 3 flux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .redirectInput(Redirect.INHERIT)
       .redirectOutput(Redirect.INHERIT)
       .redirectError(Redirect.INHERIT)
    https://docs.oracle.com/javase/7/doc...nheritIO%28%29


    a++

  18. #18
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Oh en effet, la doc était coupé sur éclipse, je n'avais pas vu que l'on pouvait descendre plus bas

    Ceci étant dit, j'ai fais la modif et je n'ai toujours pas de console^^

    Le seul moyen que j'ai trouvé pour faire afficher la console c'est de passer par un .bat qui lancera lui même le script python.

    Le problème de ça c'est que du coup le waitfor de mon process n'est plus sur le python mais sur le bat, et ça ce n'est pas bon (à moins que je trouve une solution pour dire au .bat qu'il doit attendre la fin du .py qu'il lance...

  19. #19
    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
    Citation Envoyé par Amnael Voir le message
    Ceci étant dit, j'ai fais la modif et je n'ai toujours pas de console^^
    Une console ? Si tu redirige les flux cela sera dans la même console que ton programme.


    Quel est l'intérêt d'ouvrir un console ?


    a++

  20. #20
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Mais justement, je n'ai pas de console dans mon programme puisque je lance depuis un .jar et pas depuis éclipse !

    Peut-être y a t'il un moyen d'incorporer une console au programme ? Mais là ça me dépasse quelque peu...

    EDIT: En fait je lançais mon jar en double cliquant et c'est pour ça que je n'avais pas de console ! En lançant directement par le cmd on dirait que les flux sont bien redirigé.

    En revanche c'est quand même embêtant que la console se lance pas directement en cohésion avec le jar quand on double clique.

    Quoi qu'il en soit, ce problème est désormais réglé et laissera surement la place à bien d'autres maintenant que je peux débugguer.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Exécution commande Telnet sous Java
    Par akbwalid dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 27/07/2011, 13h36
  2. [Système] Commande system() sous Windows
    Par gouakkamol dans le forum Langage
    Réponses: 1
    Dernier message: 10/01/2008, 18h43
  3. Exécution de JCL sous Windows ou Unix
    Par al1_24 dans le forum JCL - SORT
    Réponses: 3
    Dernier message: 23/07/2007, 20h33
  4. Freeze système sous windows !
    Par n!co dans le forum NetBeans
    Réponses: 3
    Dernier message: 02/11/2006, 13h10
  5. Réponses: 5
    Dernier message: 19/04/2005, 08h50

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