Python ne semble pas s'exécuter

Bonjour

J’ai déplacé la question que j’avais ajoutée à la suite d’in sujet fermé (Ce que je n’avais pas vu)

J’ai ajouté du code dans un scénario pour sortir des données sur un port série. Mais il ne semble pas s’exécuter. Dans l’Atlas il y a bien python 3.7.3.
Le port série fonctionne car j’arriver envoyer un print depuis une console SSH.
Il doit manque le détail qui tue…

$python = <<<'EOD'
#! /usr/bin/env python3
  ser = serial.Serial(
    port='/dev/ttyS2',
    baudrate=1200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)


if ser.isOpen():
    ser.close()
ser.open()
if ser.isOpen():
    ser.write("$ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz\r") 
ser.close()
#fin du script python3
EOD;

Merci pour votre aide !

Hello,

A première vue, il y a un soucis d’indentation à la troisième ligne.

A noter que la deuxième ligne est inutile mais elle ne pause pas de soucis vu que l’interpréteur python la considère comme un simple commentaire.

Le but de cette deuxième ligne (qui doit être la toute première dans un fichier exécutable) est d’indiquer au shell (l’interpréteur de ligne de commande) qu’elle est le programme qui doit interpréter le code placé dans le fichier. Mais, à priori, ton script est passé directement à l’interpréteur python sans passer pas le shell.

edit:

  • Le « ; » à la dernière ligne est probablement aussi un soucis car le flux passé à l’interpréteur se termine lorsque l’on trouve une ligne qui content exactement ce qui indiqué après les <<< de la première ligne.
  • Je ne sais pas si $python = <<<'EOD' est correct ou s’il faut mettre $python = <<< EOD à tester.

Merci ktn,
J’ai ajouté 3 espace à import serial
Enlevé le ; de la dernière ligne
Testé EOD avec et sans ‹  ›

Mais sans succès… :frowning:

J’avais pas vu le = dans la première ligne :confused:

Il faut mettre

$python <<< EOD

Mais je ne connais pas exactement le contexte dans lequel ce code est exécuté. Je pars du principe que c’est dans en shell et que la variable $python contient quelque chose du genre /usr/bin/python3

1 « J'aime »

euh… (désolé je débute); il est mis là (j’espère n’avoir rien loupé aux corrections!):

Mais ça ne sort toujours rien

Le import n’était pas dans le premier message…

Il faut enlever les espaces au début des lignes 3 et 4

$python <<< EOD
import serial
ser = serial.Serail(
   port = '/dev/ttyUSB1',
   ...
   ...
)

if ...
...

pas mieux :frowning:
J’ai bien sûr essayé avec ’ et sans les ’ sur EOD

$python <<< 'EOD'
import serial
ser = serial.Serial(
    port='/dev/ttyUSB1',
    baudrate=1200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)


if ser.isOpen():
    ser.close()
ser.open()
if ser.isOpen():
    ser.write("$ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz\r") 
ser.close()
#fin du script python3
EOD

Bonjour,

Vous ne pouvez pas mettre du code python dans un bloc code, uniquement du code php.
Utilisez le plugin script pour exécuter un script python.

1 « J'aime »

Et rien dans les log?

Je n’ai pas de jedoom sous la main pour tester. Il m’est donc difficile d’aider plus. Je pourrai faire des tests ce soir…

Dans temps réel, on voit que le scénario a été déclenché par l’user !

Ensuite comment faire pour passer des valeurs ? Par exemple j’aimerais envoyer sur le port série la valeur de mon capteur de luminosité.

Merci d’avance !

C’était le but du post d’origine déterré par @sil après 2 ans. Du python mis dans un fichier par un bloc code et exécuté par le bloc code.
Il s’en est inspiré en « corrigeant » beaucoup trop. :wink:
Le post d’origine:

Dans ce qui a été fait, il manque l’exécution du code python.

En dehors des erreurs de syntaxe python et php, il manque les commandes d’exécution du python situées à la fin du bloc code du post que vous avez déterré.

En reprenant le post d’origine avec votre python, ca pourrait donner:

$script = 'monpython.py';        //Nom du fichier python
$chemin = '/var/www/html/python'; // Dossier à utiliser

if (1){ //metre à 1 la 1er fois, une fois que le fichier existe et n'est plus modifier mettre a 0
// Script python
$python = <<<'EOD'
#! /usr/bin/env python3
import serial
ser = serial.Serial(
    port='/dev/ttyS2',
    baudrate=1200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)

if ser.isOpen():
    ser.close()
ser.open()
if ser.isOpen():
    ser.write(str.encode('$ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz\r')) 
ser.close()
#fin du script python3
EOD;
mkdir($chemin); // creation du dossier
file_put_contents($chemin.'/'.$script, $python); // Ecriture du fichier
}

$reponse = shell_exec('python3 '.$chemin.'/'.$script);  // execution du script 

Après une première exécution du scénario, le fichier /var/www/html/python/monpython.py existe
Vous pouvez alors l’exécuter en ssh en tapant python3 /var/www/html/python/monpython.py pour vérifier qu’il fonctionne correctement et/ou le debugger.

Merci à tous pour votre aide. :+1:
Cependant je suis un peu perdu.

Oui en effet. Je pensais que l’on pouvait mettre « simplement » du code Python ici. pour autant qu’il soit encadré de EOD

J’ai mis ce code à la place de l’autre.
Si je comprends bien le code est ici mais on va la copier dans un fichier nommé monpython.py afin de pouvoir ensuite l’exécuter.
Je dois avoir mal compris (par manque de compétence de ma part!) car c’est curieux de faire du code pour copier ce code dans un fichier…

Il a été exécuté.

Puis depuis OS/DB la commande python3 /var/www/html/python/monpython.py a été envoyée mais sans succès (bien sur le port a été changé)
mais il affiche:

Traceback (most recent call last):
File « /var/www/html/python/monpython.py », line 7, in
print(soupe.find_all(class_ =« current_description »)[0].span.next.next.next.next.split()[0],end=‹  ›)
IndexError: list index out of range

Si j’en crois le message d’erreur à la fin, vous avez repris le code du post d’origine.
Il faut exécuter le scénario au moins 1 fois sans erreur pour que le fichier monpython.py soit correct.

Oui c’est ça. Le code python est écrit dans le fichier par le bloc code avant exécution par le bloc code.

L’erreur est due à un changement de la structure du html sur le site meteoblue. Il faudrait corriger le python dans le scénario pour ne plus avoir cette erreur si vous vouliez récupérer la vitesse du vent. C’est du code du post d’origine.

Non j’ai recopié le code que vous m’avez bien gentiment adapté du message n°12.

Je ne veux pas afficher la vitesse du vent mais sortir des datas sur le port série selon mon code ci-dessus !

Finalement, je ne connais pas le php mais ce serait peut-être plus simple d’écrire cela en php…

Montrez-nous le log de l’exécution du scénario.
Et le contenu du fichier /var/www/html/python/monpython.py

J’ai lancé le script depuis la fenêtre scénario où j’ai copié le code puis appuyé sur exécuter.
Mais je pense que ce doit être faux.

Mes connaissance en Linux étant à peu près nulle je ne sais pas où trouver, ni lire le fichier monpython.py !
C’est d’ailleurs pour cela que j’ai préféré une box toute faire; que de faire sa box depuis un Rasberry.

Je trouvais intéressant de pouvoir mettre du code directement dans un scénario et de s’affranchir de devoir faire du Linux.

Selon le post d’origine et @ktn semblait aussi le confirmer on pourrait (?) inclure du Python à cet endroit en faisant
$python <<< EOD
le code Python
EOD

En grattant un peu pour essayer de simplifier , j’i regardé en php. On peut adresser un port série ainsi:

<?php
	echo system("echo \"hello\" > /dev/ttyUSB1");
?>

Mais je n’ai rien en sortie non plus. Il doit ici aussi manquer quelque chose.

Merci !

Bonjour,

Qu’obtenez-vous en faisant exécuter depuis OS/DB la commande? :

python3 /var/www/html/python/monpython.py

Bonjour,
merci

Traceback (most recent call last):
File « /var/www/html/python/monpython.py », line 7, in
print(soupe.find_all(class_ =« current_description »)[0].span.next.next.next.next.split()[0],end=‹  ›)
IndexError: list index out of range