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 :

Arrêt non souhaité programme Python lancé par Java


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 46
    Points
    46
    Par défaut Arrêt non souhaité programme Python lancé par Java
    Bonjour à tous.

    Voilà mon contexte : J'ai un programme python qui est lancé par un Runtime dans un programme Java. Ce programme est connecté à un thread java via une connexion udp et communiquent entre eux. Les transmissions se passent très bien jusqu'à un certain moment (toujours le même), le programme python s'arrête. Le programme java écoute toujours mais ne reçoit rien. Et lorsque je lance le programme java et le programme python séparément (manuellement pour les deux), kes transmissions se passent très bien de bout en bout.

    Avez vous une idée sur l'origine du problème ?

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    A vue de boule de cristal, je penserais à un probleme de consommation des flux (standard et erreur). Voir ici :
    http://ydisanto.developpez.com/tutor.../runtime-exec/
    Il faudrait poster le code de lancement du process pour voir s'il n'y a pas quelque chose à ce niveau la.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 46
    Points
    46
    Par défaut
    Merci pour ta réponse. Je vais regardé le lien. Voilà la méthode run :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @Override
    public void run(){
     
        try {
            System.out.println("ça marche bien ");
    	Runtime.getRuntime().exec(" python cutter.py ");
        } catch (IOException e) {
    	e.printStackTrace();
        } 
    }

  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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    regarde si ce n'est pas un problème d'environnement. La méthode exec de Runime exécute la commande avec un environnement fourni par ton programme qui peut être différent de celui présent quand tu exécutes ton programme python directement sous shell. Compare l'environnement existant dans ton shell de commandes et celui utilisé par Runtime.getRuntime().exec(...)

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 46
    Points
    46
    Par défaut
    Salut !
    Mais si c'est un problème d'environnement, pourquoi est ce qu'au début les transmissions se font bien et qu'ensuite seulement elles se bloquent ?

  6. #6
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il peut y avoir plein de raisons : l'espace mémoire alloué, un paramètre qui indique une durée d'éxécution, une valeur de paramètre qui fait qu'on obtient un deadllock au bout d'un certain temps ou une fuite de mémoire. c'est bien le problème des environnements : c'est qu'ils changent la façon dont est éxécuté un programme.

    C'est peut être pas du tout un problème d'environnement. Mais avant d'en être sur pour éliminer ce cas possible, on peut le vérifier, et c'est facile. Après je lancerais jvisualvm pour voir l'état des thrreads, puis je lancerai l'appli en mode debug pour voir, en particulier l'état du process python, également tracer ses sorties (out et err), etc...

  7. #7
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il peut y avoir des avantages à utiliser java.lang.ProcessBuilder plutôt que directement un Runtime.getRuntime().exec(...).

    En particulier pour avoir le flux d'erreur dans la console...

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 46
    Points
    46
    Par défaut
    Ok... mais du coup comment est ce que je peux vérifier les environnements ? Je suis pas vraiment calé sur le sujet...

  9. #9
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par a1331 Voir le message
    Ok... mais du coup comment est ce que je peux vérifier les environnements ? Je suis pas vraiment calé sur le sujet...
    justement avec la classe ProcessBuilder dont je parlais juste avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ProcessBuilder pb = new ProcessBuilder(taCommande);
    Map<String, String> env = pb.environment(); 
    System.out.println(env);
    EDIT: je viens de penser que tu voulais peut être aussi savoir comment voir ton environnement dans le shell :

    sous windows, la commande est set
    sous linux, la commande est printenv

  10. #10
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    A en juger par ta ligne de commande, tu ne geres pas les flux. Or, ne pas le faire, risque... de bloquer le programme. Bref, ca ressemble à ce que tu observes. Essaie donc de gérer les flux comme dans le lien pour voir si ca change quelque chose...

  11. #11
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 46
    Points
    46
    Par défaut
    Je gère les datagrammes en entrée :

    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
    @Override	
    public void run(){		
    	DatagramSocket socket;
    	byte[] buffer = new byte[2048];
    	DatagramPacket p = new DatagramPacket(buffer, buffer.length); 
            DataSource data;
            String connexion;
    		try{
    			socket =  new DatagramSocket(12345);	
    			do {
    				Arrays.fill(buffer, (byte)0);
    				socket.receive(p);
    				connexion = new String(p.getData());
     
    				if(connexion != null){
    					//traitement de connexion
                                     } 
                             } while(condition);
                     } catch (Exception e) {
    				e.printStackTrace();
                     }
    }

  12. #12
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 46
    Points
    46
    Par défaut
    Pour l'environnement, quelle(s) information(s) est (sont) importante(s) dans tout ce qui est donné ?

  13. #13
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    @hwoarang te parlais des flux de sortie de ton process, donc soit comme indiqué suite au lien indiqué par un truc dans le genre :

    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
     
    Process process = Runtime.getRuntime().exec(command);
    final BufferedReader stdErr = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    		new Thread() {
    			@Override
    			public void run() {
    				 String line;
    	            try {
    	                while ((line = stdErr.readLine()) != null) {
    	                    System.err.println(line);
    	                }
    	            } catch (Exception e) {
    	            	throw new Error(e);
    	            }
    	            finally {
    	            	try {
                                stdErr.close();
                            } catch(IOException e) {};
    	            }
    			};
    		}.start();
    soit avec ProcessBuilder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ProcessBuilder pb = new ProcessBuilder(command);
    pb.redirectErrorStream(true);

  14. #14
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par a1331 Voir le message
    Pour l'environnement, quelle(s) information(s) est (sont) importante(s) dans tout ce qui est donné ?
    commence par voir si toutes les variables qui sont dans l'un sont dans l'autre (et vice versa) : si ce n'est pas le cas, il faudrait voir si les variables manquantes dans l'env java concerne ton programme python (donc l'environnement python proprement dit et l'environnement propre à ton prog s'il y en a un)

  15. #15
    Membre du Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 46
    Points
    46
    Par défaut
    ça marche nickel avec la gestion des flux !

    Merci beaucoup à tous les deux pour votre aide et votre temps !!!

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

Discussions similaires

  1. Code retour d'un programme Java lancé par bat/.sh
    Par ghiwani80 dans le forum Général Java
    Réponses: 3
    Dernier message: 22/10/2012, 09h17
  2. Arrêt de la macro lorsque lancée par un raccourcis clavier
    Par Korleone dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/08/2011, 08h33
  3. Transformer Programme C en classe java par C2J
    Par tom31 dans le forum Général Java
    Réponses: 1
    Dernier message: 07/04/2008, 22h58
  4. Probleme de classes non trouvées par Java
    Par poleta77 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 15/08/2007, 16h23
  5. Problème d'encodage d'une commande lancée par java
    Par Pointu dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/04/2006, 00h35

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