Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Java & Python

2 views
Skip to first unread message

vistar76

unread,
Nov 9, 2009, 3:55:52 AM11/9/09
to
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.

Yliur

unread,
Nov 9, 2009, 4:11:04 PM11/9/09
to
Le Mon, 09 Nov 2009 02:55:52 -0600
vistar76 <vist...@domain-xyz.in> 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.

jlp

unread,
Nov 10, 2009, 11:44:35 AM11/10/09
to
Yliur a �crit :

> Le Mon, 09 Nov 2009 02:55:52 -0600
> vistar76 <vist...@domain-xyz.in> 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).

vistar76

unread,
Nov 13, 2009, 10:04:39 AM11/13/09
to
vistar76 a �crit le 09/11/2009 � 09h55 :
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.

0 new messages