Files
JIMRI/help/fr/html/doc/Technical/Jython.shtml
T
2026-06-17 14:00:51 +02:00

375 lines
14 KiB
Plaintext

<!DOCTYPE html>
<html lang="fr">
<!--Updated by Herv&#233; Blorec 2016-08-05 -->
<head>
<title>Acc&#232;s de Jython</title>
<meta name="author" content="Bob Jacobsen">
<meta name="keywords" content="JMRI technical code CVS FAQ">
<!--#include virtual="/help/fr/parts/Style.shtml" -->
</head>
<body>
<!--#include virtual="/help/fr/parts/Header_fr.shtml" -->
<div id="mBody">
<!--#include virtual="Sidebar.shtml" -->
<div id="mainContent">
<!-- Page Body -->
<h1>Acc&#232;s de Jython aux outils JMRI</h1>
Cette page parle de l'acc&#232;s depuis Jython aux librairies JMRI, une version Java
de Python. L'accent est mis sur l'utilisation des capacit&#233;s de JMRI depuis une
ligne de commmande d'un interpr&#234;teur Jython.
<b>cette page n'est pas sur les scripts avec Jython &#224; l'int&#233;rieur de JMRI. </b>
Voir les
<a href="../../tools/scripting/index.shtml">pages de script</a> Si vous
&#234;tes plus int&#233;resser par les scripts Jython au sein de JMRI.
<p>
Notez que cette page est quelque peu d&#233;pass&#233;e; les num&#233;ro de version, etc
peuvent ne plus &#234;tre actuels
<h2>Introduction</h2>
<a href="http://www.python.org">Python</a> est un langage script couramment utilis&#233; qui est
disponible sur de nombreux types d'ordinateurs. Une version bas&#233;e Java, appel&#233;e
<a href="http://www.jython.org">Jython</a>,
a &#233;t&#233; int&#233;gr&#233;e avec JMRI pour rendre la commande d'un r&#233;seau de chemin de fer
ais&#233;e depuis les lignes de commandes de l'ordinateur.
<p>
Pour utiliser la biblioth&#232;que JMRI &#224; partir de Jython, vous devez vous assurer que Jython
recherchera les fichiers jar corrects quand il d&#233;marre. Nous fournissons un
script "jmrithon" de d&#233;marrage qui le fera pour vous.
<code>
% ./jmrithon
execFileJython 2.1 on java1.4.1_01 (JIT: null)
(Taper "copyright", "credits" ou "license" pour plus d'informations.
&gt;&gt;&gt;
</code>
Une fois obtenu l'invite Jython "&gt;&gt;&gt;", vous pouvez
taper des instructions Python.
<p>
Nous avons fourni quelques fichiers de commandes Python pour rendre
plus facile le d&#233;marrage.
<p>
Par exemple, vous pouvez d&#233;marrer les applications PanelPro depuis des
lignes de commandes Jython, qui sont ensuite disponibles pour la manipulation
des objets comme les aiguillages et les capteurs:
<pre>
execfile("PanelPro.py")
0 PanelPro.PanelPro INFO - programme d&#233;marre [principal]
11109 PanelPro.PanelPro INFO - initialisation principale termin&#233;e [principal]
>>> turnouts.newTurnout("LT1", "")
jmri.jmrix.loconet.LnTurnout@1a8f49
>>> turnouts.getTurnout("LT1").getCommandedState()
1
>>> lt1 = turnouts.getTurnout("LT1")
>>> lt1.setCommandedState(CLOSED)
>>> lt1.commandedState
2
>>> lt1.commandedState = CLOSED
>>> lt1.commandedState
4
>>>
</PRE>
Notez que ceci ex&#233;cute une version compl&#232;te de l'application PanelPro;
toutes les fen&#234;tres et les menus sont pr&#233;sent&#233;s de la m&#234;me fa&#231;on, la configuration
se fait par le panneau de pr&#233;f&#233;rences, etc. Ce que la connexion Jython ajoute est une
ligne de commande &#224; partir de laquelle vous pouvez manipuler directement les choses.
<br>Cela montre aussi certaines des simplifications que
Jython et le langage Python apportent &#224; l'utilisation du code JMRI. La
fonction de membre de Java:
<PRE>
turnout.setCommandedState(jmri.Turnout.CLOSED);
</PRE>
peut aussi &#234;tre exprim&#233;e en Jython comme:
<PRE>
turnout.commandedState = CLOSED (Droit)
</PRE>
<br>
Ce r&#233;sultats est dans un code plus facile &#224; lire.
<p>
Il y beaucoup de livres Python utiles ainsi
que des tutoriels en ligne.
Pour plus d'informations sur le langage Jython et ces
relations avec Java, la meilleure r&#233;f&#233;rence est le
<a href="http://www.oreilly.com/catalog/jythoness/"> Jython Essentials</a>
livre publi&#233; par O'Reilly. Le
<a href="http://www.jython.org/">site web jython.org</a> est aussi tr&#232;s utile
<h2>Installation</h2>
Le support Jython n'est pas (encore) standard dans JMRI. Pour utiliser ceci:
<ol>
<li>Vous devez avoir une installation JMRI utilisable. En particulier, d&#233;marrez
l'application JMRI et la configurer pour se connecter &#224; votre mat&#233;riel de
DCC, puis enregistrer, quitter et red&#233;marrer le programme. Assurez-vous que le
connexion fonctionne pour les menus bas&#233;s sur les outils avant d'essayer d'utiliser Jython.
<li>T&#233;l&#233;charger et installer Jython depuis
<a href="http://www.jython.org">http://www.jython.org</a>.
Le d&#233;veloppement utilise la version 2.1, donc vous
pouvez commencer avec ceci. Sur Mac OS X, l'installateur ne s'ex&#233;cute pas, vous
devez donc appeler manuellement le fichier jython_21.class; voir la note Mac OS X
sur le site web de Jython. Assurez-vous que l'installation est termin&#233;e
en appelant Jython depuis la ligne de commande:
<PRE>
% jython
Jython 2.1 on java1.4.1_01 (JIT: null)
Taper "copyright", "credits" ou "license" pour plus d'information".
>>> ^D
</PRE>
Si celui ci travaille, votre installation est OK. Si non, vous devez
corriger votre syst&#232;me avant de pouvoir passer &#224; l'&#233;tape suivante.
<p>
Si l'installateur ne fonctionne pas,
T&#233;l&#233;chargez le fichier jython_21.class depuis SourceForge, et
entrez &#224; une invite de commande:
<PRE>
java -cp . jython_21
</PRE>
puis suivre les invites &#224; travers l'installateur.
<p>
Si le programme d'installation ne fonctionne pas, mais la commande jython n'est pas trouv&#233;e:
<ul>
<li>Windows: Trouver le fichier jython.bat que l'installateur a cr&#233;&#233;,
et copiez-le dans votre r&#233;pertoire C: \WINDOWS .
<li>Linux: Assurez-vous que le r&#233;pertoire d'installation de Jython est sur votre chemin.
</ul>
<li>
Maintenant vous avez juste &#224; avoir les classes n&#233;cessaires dans le CLASSPATH
utilis&#233; lorsque jython d&#233;marre. La liste impos&#233;e dans la syntaxe Unix est:
<PRE>
setenv CLASSPATH .:jmri.jar:lib/log4j.jar:lib/collections.jar:lib/crimson.jar:lib/jdom-jdk11.jar
</PRE>
<br>
Pour enregistrer la saisie, le script "jmrithon" est disponible pour une utilisation sur les syst&#232;mes Linux et Mac OS X:
<PRE>
% ./jmrithon
Jython 2.1 on java1.4.1_01 (JIT: null)
Taper "copyright", "credits" ou "license" pour plus d'information
>>> ^D
</PRE>
<br>La premi&#232;re fois que vous ex&#233;cutez ceci, vous obtiendrez un certain nombre de messages
sur "les traitement modifi&#233;es jar"; ceux-ci peuvent &#234;tre ignor&#233;s, car ils sont normaux.
</ol>
<h2>Utilisation directe de Jython </h2>
Cette section de la page est un tas d'informations utiles sur
le contr&#244;le de JMRI depuis Jython directement.
<p>
Notez que vous n'avez pas plus besoin de ceci lors de l'ex&#233;cution
des scripts PanelPro.py ou similaire, car ils g&#232;rent le d&#233;marrage
d'une application compl&#232;te.
<h3>Initialisation</h3>
JMRI utilise largement le syst&#232;me LogJ pour des informations de rapport
pendant l'ex&#233;cution du programme. Pour configurer, lors de l'ex&#233;cution avec
Jython, vous devez faire:
<PRE>
import org.apache.logging.log4j.core.config.Configurator
Configurator.initialize(null, "default_lcf.xml");
</PRE>
avant de commencer l'une des classes JMRI. Le "default_lcf.xml"
est le nom du fichier de contr&#244;le connect&#233; qui sera utilis&#233;, il peut
&#234;tre omis.
<p>
Pour rendre les classes JMRI disponible, vous avez &#224; faire:
<PRE>
import jmri
</PRE>
Tel qu'il est actuellement configur&#233;, celui-ci n'ex&#233;cute pas n'importe quel code d'initialisation
pour commencer les connexions mat&#233;rielles, etc.
Une fa&#231;on de faire est de charger un fichier de configuration, peut-&#234;tre un
que vous avez cr&#233;&#233; pr&#233;c&#233;demment via le panneau de pr&#233;f&#233;rences PanelPro:
<PRE>
import java.io
configfile = java.io.File(jmri.util.FileUtil.getPreferencesPath()+"PanelProConfig2.xml")
jmri.InstanceManager.setConfigureManager(jmri.configurexml.ConfigXmlManager())
jmri.InstanceManager.getDefault(jmri.ConfigureManager).load(configfile)
</PRE>
pour activer les classes JMRI et vous connecter &#224; votre r&#233;seau.
PanelProConfig2.xml "est le nom du fichier de configuration depuis
le programme PanelPro; vous pouvez utiliser un autre nom si vous le souhaitez.
Le fichier de configuration contr&#244;le la connexion au r&#233;seau, et toute autre
option qui peut avoir &#233;t&#233; mise quand il a &#233;t&#233; cr&#233;&#233;.
<p>
Alternativement, si vous voulez d&#233;marrer l'application PanelPro compl&#232;te,
y compris la barre de menu, l'&#233;cran d'accueil, etc, vous pouvez faire::
<PRE>
import apps
apps.PanelPro.PanelPro.main([])
</PRE>
<p>
Cela va d&#233;marrer le programme, y compris sa configuration de d&#233;marrage, etc
<p>
Pour simplifier ce d&#233;marrage encore plus, vous pouvez faire:
<PRE>
execfile("PanelPro.py")
</PRE>
pour appeler ces commandes .
<h3>Acc&#232;s &#224; JMRI</h3>
JMRI utilise beaucoup le mod&#232;le-usine pour obtenir l'acc&#232;s aux objets.
En Java il en r&#233;sulte du code verbeux comme
<PRE>
Turnout t2 = InstanceManager.turnoutManagerInstance().newTurnout("LT2", "turnout 2");
t2.setCommandedState(Turnout.THROWN)(aiguillage D&#201;VI&#201;)
</PRE>
Jython simplifie ceci, en nous permettant de fournir des variables utiles,
et par le raccourcissement des appels &#224; certaines m&#233;thodes.
<p>
Pour avoir acc&#232;s &#224; des gestionnaires de feux de signalisation, capteur et aiguillage
et l'objet CommandStation,
les variables de plusieurs raccourcis sont d&#233;finies dans les scripts .py &#233;num&#233;r&#233;s ci-dessus
<ul>
<li>sensors
<li>signals
<li>turnouts
<li>lights
<li>reporters
<li>memories
<li>dcc
<li>audio
</ul>
Celles-ci peuvent ensuite &#234;tre r&#233;f&#233;renc&#233;es directement dans Jython comme
<PRE>
t2 = turnouts.provideTurnout("12");
dcc.
</PRE>
Notez que la variable t2 n'a pas besoin d'&#234;tre d&#233;clar&#233;e.
<p>
Jython fournit un raccourci pour les param&#232;tres qui ont
&#233;t&#233; d&#233;finis avec Java-Bean-like les m&#233;thodes get et set:
<PRE>
t2.setCommandedState(Turnout.THROWN)(D&#233;vi&#233;)
</PRE>
peuvent &#234;tre &#233;crites
<PRE>
t2.commandedState = THROWN(D&#233;vi&#233;)
</PRE>
ou l'affectation est en fait l'appel de la m&#233;thode d&#233;finie..
Notez &#233;galement que THROWN(D&#233;vi&#233;)
a &#233;t&#233; d&#233;fini lors de l'ex&#233;cution du script Python
au d&#233;marrage; CLOSED(Direct), ACTIVE(Actif, INACTIVE(Inactif), RED, YELLOW et GREENVERT sont
&#233;galement d&#233;fini.
<p>
Un m&#233;canisme similaire peut &#234;tre utilis&#233; pour v&#233;rifier l'&#233;tat de chose:
<PRE>
>>> print sensors.provideSensor("3").knownState == ACTIVE
1
>>> print sensors.provideSensor("3").knownState == INACTIVE
0
</PRE>
Notez que Jython utilise "1" pour indiquer vrai, et "0" pour indiquer
faux, de sorte que le capteur 3 est actuellement actif dans cet exemple
<p>
Vous pouvez aussi appeler directement les m&#233;thodes, par exemple d'envoyer un paquet DCC
vers les rails, vous tapez:
<PRE>
dcc.sendPacket([0x01, 0x03, 0xbb], 4)
</PRE>
Cela envoie ce paquet de trois octets quatre fois, puis retourne &#224;
la ligne de commande.
<p>
Pour quitter, soit ^ C &#224; partir de la ligne de commande ou utilisez la
commande sortie dans le menu.
<h2>Utilisation de Python pour signal logique et automatisation</h2>
Les classes "<a href="https://jmri.org/JavaDoc/doc/jmri/jmrit/automat/package-summary.html">Automate</a>"
existantes de JMRI fournissent des crochets pour l'automatisation du r&#233;seau utilisateur, y compris la signalisation.
Mais ils exigent que vous &#233;criviez du code Java et de le compiler en fichiers .class.
<h2>Etapes suivantes</h2>
Nous sommes seulement &#224; apprendre comment int&#233;grer au mieux JMRI et Python, donc il y a
encore quelques myst&#232;res fondamentaux.
<h3>Initialisation et modules</h3>
L'id&#233;e de "modules" Python n'est pas encore
clairement compris. Il y a trois fa&#231;ons de d&#233;marrer le programme via
un fichier .py:
<ol>
<li>
<PRE>
% ./jmrithon
Jython 2.1 on java1.4.1_01 (JIT: null)
Taper "copyright", "credits" ou "license" pour plus d'informations
>>> import PanelPro
</PRE>
Cela fonctionne, en ce sens que le programme d&#233;marre. Mais
les m&#233;thodes commodes sont toutes dans le namespace PanelPro:
<PRE>
>>> turnouts.newTurnout("LT1","")
Traceback (innermost last):
File "&lt;console&gt;", line 1, in ?
NameError: turnouts
>>> PanelPro.turnouts.newTurnout("LT1","")
jmri.jmrix.loconet.LnTurnout@36b91b
</PRE>
ce qui fait nettement plus &#224; taper plus tard.
Et il est d&#233;routant, car selon que vous ayez commenc&#233;
PanelPro, DecoderPro ou une autre application, les noms seront
diff&#233;rents.</li>
<li>
<PRE>
% ./jmrithon
>>> execfile("PanelPro.py")
</PRE>
<PRE>
% ./jmrithon -PanelPro.py
</PRE>
Cela semble un peu moche, car ce n'est pas en utilisant les modules techniques normaux de Python.
Mais les m&#233;thodes commodes sont
dans le namespace de niveau sup&#233;rieur:
<PRE>
turnouts.newTurnout("LT1", "")
</PRE>
<br>
Nous avons besoin de comprendre si c'est un vrai probl&#232;me. La plupart des programmes
Python n'utilisent pas cet namespace de haut niveau, et il y a probablement
une bonne raison!</li>
</ol>
Nous avons besoin de comprendre comment les d&#233;veloppeurs de Jython ont pr&#233;vu de faire ceci.
<h3> R&#233;siliation </h3>
Une fois que la t&#226;che principale JMRI (ou t&#226;che Swing GUI ?) a commenc&#233;e,
^ D ne suffit pas pour faire quitter le programme. Vous devez s&#233;lectionner
"Quit" dans le menu fichier actuel, ou ^ C du programme.
<p>
Il serait bon de comprendre ce qui emp&#234;cher le programme
d'arr&#234;ter quand il obtient l'^D.
<!--#include virtual="/help/fr/parts/Footer_fr.shtml" -->
</div>
</div>
<script src="/js/help.js"></script>
</body>
</html>