Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Java & Python

3 réponses
Avatar
vistar76
Bonjour, j'essaye de créer une application Java qui appel du Python. L'application est assez simple je veux entrer un nombre et une fois cliquer sur le bouton qu'il fasse le nombre * 2 qui est dans le python et afficher le résultat

voici Fenetre.java
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JOptionPane;

import org.python.core.PyObject;
import org.python.core.PyString;
import org.python.core.imp;



public class Fenetre extends JFrame {


/**
*
*/
private static final long serialVersionUID = 4690957658239511310L;
private JPanel container = new JPanel();
private JFormattedTextField nombre = new JFormattedTextField(NumberFormat.getIntegerInstance());
private JLabel label = new JLabel("Table de :");
private JButton b = new JButton ("OK");
private PyObject Exemple;
private JOptionPane Resultat;

public Fenetre(String title) {
super(title);
AppelPy();
}

protected void AppelPy() {
// chargement table.py module
PyObject findMod = imp.importName("table", true);
// prend la "class table"
PyObject ClassTable = findMod.__getattr__("table");
// crée une instance
Exemple = ClassTable.__call__();
}

public void ConstruitPy() {
//construit PY
PyObject res;
res = Exemple.invoke("tableX",new PyString(nombre.getText()));
res = Exemple.invoke("resultat",new PyString(nombre.getText()));


}

public Fenetre()
{

this.setTitle("Table de N");
this.setSize(300, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);

container.setBackground(Color.white);
container.setLayout(new BorderLayout());

JPanel top = new JPanel();

Font police = new Font("Arial", Font.BOLD, 14);
nombre.setFont(police);
nombre.setPreferredSize(new Dimension(150, 30));
nombre.setForeground(Color.BLUE);


b.addActionListener(new BoutonListener());

top.add(label);
top.add(nombre);
top.add(b);


this.setContentPane(top);
this.setVisible(true);
}

class BoutonListener implements ActionListener{

public void actionPerformed(ActionEvent e)
{
JOptionPane jop = new JOptionPane(Resultat);
jop.showMessageDialog(null, "Le résultat est " + nombre.getText(), "Résultat", JOptionPane.INFORMATION_MESSAGE);

}

}
}

voici table.py
#! /usr/bin/python
# -*- coding: ISO-8859-1 -*-
class table:
def tableX(n):
print (n * 2),

def resultat(n):
tableX(n),


Pour le moment j'affiche juste nombre.getText() mais je voudrai à la place qu'il fasse le python et que j'affiche le résultat mais je ne sais pas comment faire si quelqu'un peut m'aider svp ou me donner un tuto... je suis preneur.

3 réponses

Avatar
Yliur
Le Mon, 09 Nov 2009 02:55:52 -0600
vistar76 a écrit :

Bonjour, j'essaye de créer une application Java qui appel du Python.
L'application est assez simple je veux entrer un nombre et une fois
cliquer sur le bouton qu'il fasse le nombre * 2 qui est dans le
python et afficher le résultat

[...]

Pour le moment j'affiche juste nombre.getText() mais je voudrai à la
place qu'il fasse le python et que j'affiche le résultat mais je ne
sais pas comment faire si quelqu'un peut m'aider svp ou me donner un
tuto... je suis preneur.



Tu peux exécuter des commandes depuis Java, avec
Runtime.getRuntime().exec (...) ;

Ça te crée un processus (classe Process) avec lequel tu peux
communiquer en utilisant des flux de communication (récupérables avec
getErrorStream(), getInputStream(), getOutputStream()).

Attention : ton exemple est tout petit et ça ne posera pas problème,
mais en principe il faut absolument lire ce qui arrive dans les flux
d'entrée et d'erreur, sinon si ta commande écrit dans ces flux et au
bout d'un moment ils sont pleins (un tampon se remplit quelque part)
et ça bloque l'exécution de la commande. Donc il faut lancer des
fils d'exécutions (threads) pour lire ces deux flux, même si tu ne
fais rien du résultat, juste pour les consommer.
Avatar
jlp
Yliur a écrit :
Le Mon, 09 Nov 2009 02:55:52 -0600
vistar76 a écrit :


Bonjour, j'essaye de créer une application Java qui appel du Python.
L'application est assez simple je veux entrer un nombre et une fois
cliquer sur le bouton qu'il fasse le nombre * 2 qui est dans le
python et afficher le résultat

[...]

Pour le moment j'affiche juste nombre.getText() mais je voudrai à la
place qu'il fasse le python et que j'affiche le résultat mais je ne
sais pas comment faire si quelqu'un peut m'aider svp ou me donner un
tuto... je suis preneur.




Tu peux exécuter des commandes depuis Java, avec
Runtime.getRuntime().exec (...) ;

Ça te crée un processus (classe Process) avec lequel tu peux
communiquer en utilisant des flux de communication (récupérables avec
getErrorStream(), getInputStream(), getOutputStream()).

Attention : ton exemple est tout petit et ça ne posera pas problème,
mais en principe il faut absolument lire ce qui arrive dans les flux
d'entrée et d'erreur, sinon si ta commande écrit dans ces flux et au
bout d'un moment ils sont pleins (un tampon se remplit quelque part)
et ça bloque l'exécution de la commande. Donc il faut lancer des
fils d'exécutions (threads) pour lire ces deux flux, même si tu ne
fais rien du résultat, juste pour les consommer.



ProcessBuilder a plus de fonctionalités que Runtime. Par exemple
paramétrage du répertoire d'execution ( depuis java 5 de mémoire).
Avatar
vistar76
vistar76 a écrit le 09/11/2009 à 09h55 :
Bonjour, j'essaye de créer une application Java qui appel du Python.
L'application est assez simple je veux entrer un nombre et une fois cliquer sur
le bouton qu'il fasse le nombre * 2 qui est dans le python et afficher le
résultat

voici Fenetre.java
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JOptionPane;

import org.python.core.PyObject;
import org.python.core.PyString;
import org.python.core.imp;



public class Fenetre extends JFrame {


/**
*
*/
private static final long serialVersionUID = 4690957658239511310L;
private JPanel container = new JPanel();
private JFormattedTextField nombre = new
JFormattedTextField(NumberFormat.getIntegerInstance());
private JLabel label = new JLabel("Table de :");
private JButton b = new JButton ("OK");
private PyObject Exemple;
private JOptionPane Resultat;

public Fenetre(String title) {
super(title);
AppelPy();
}

protected void AppelPy() {
// chargement table.py module
PyObject findMod = imp.importName("table", true);
// prend la "class table"
PyObject ClassTable = findMod.__getattr__("table");
// crée une instance
Exemple = ClassTable.__call__();
}

public void ConstruitPy() {
//construit PY
PyObject res;
res = Exemple.invoke("tableX",new PyString(nombre.getText()));
res = Exemple.invoke("resultat",new
PyString(nombre.getText()));


}

public Fenetre()
{

this.setTitle("Table de N");
this.setSize(300, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);

container.setBackground(Color.white);
container.setLayout(new BorderLayout());

JPanel top = new JPanel();

Font police = new Font("Arial", Font.BOLD, 14);
nombre.setFont(police);
nombre.setPreferredSize(new Dimension(150, 30));
nombre.setForeground(Color.BLUE);


b.addActionListener(new BoutonListener());

top.add(label);
top.add(nombre);
top.add(b);


this.setContentPane(top);
this.setVisible(true);
}

class BoutonListener implements ActionListener{

public void actionPerformed(ActionEvent e)
{
JOptionPane jop = new JOptionPane(Resultat);
jop.showMessageDialog(null, "Le résultat est
" + nombre.getText(), "Résultat",
JOptionPane.INFORMATION_MESSAGE);

}

}
}

voici table.py
#! /usr/bin/python
# -*- coding: ISO-8859-1 -*-
class table:
def tableX(n):
print (n * 2),

def resultat(n):
tableX(n),


Pour le moment j'affiche juste nombre.getText() mais je voudrai à la
place qu'il fasse le python et que j'affiche le résultat mais je ne sais
pas comment faire si quelqu'un peut m'aider svp ou me donner un tuto... je suis
preneur.


merci pour vos réponses, j'ai fait autrement et je vais en écrire un tuto sur un site pour les débutants. Maintenant j'ai un autre souci, Win32Api.
J'ai une application en Python, quand je la lance, j'ai aucun souci, le win32 est bien présent dans site-packages de Python26, ... l'application tourne car il importe bien win32api.
En revanche, j'ai crée en java une application avec un bouton pour lancer l'application de python, le seul souci est que lui me met comme erreur :
ImportError: No module named win32api
Dans PythonPath j'ai passé dans External Librairies le dossier win32 mais toujours le souci. Je trouve pas comment faire pour que celui ci arrive à bien importer le win32api.

Mon autre souci vient aussi du faite que :
Code :
if sys.platform == 'win32':
import win32api
else:
import pwd

En python win32 est bien mon sys.platform en revanche pour Java il me met
java1.6.0_16 dans mon sys.platform.
J'ai essayé avec props.setProperty("sys.platform", "win32"); mais le problème reste le même.