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;
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.
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
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.
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.
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.
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:
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