Bonjour,
Je vais essayer d’être le plus clair, ce qui n’est pas évident.
J’ai un raspberry pi 4 avec raspbian 64 bits (mis à jour ce matin) et python 3.9. J’ai également installé apache pour faire du php.
Je suis dans le répertoire /var/www/html/steeve. Le répertoire steeve est dans le groupe www-data et raspberry (moi) est le propriétaire. Pour le moment, ce répertoire à tous les droits (pas bien).
Dans ce répertoire, j’ai un programme python qui génère une image (.png). Le programme est dans le groupe www-data et raspberry (moi) est le propriétaire. Je lance ce programme depuis Thonny et le programme crée l’image sans soucis.
Ensuite, j’ouvre un shell et je tape :
echo ‹ debut › && cd /var/www/html/steeve/ && ls -lart && python /var/www/html/steeve/correction_RST_BD_BO.py && echo ‹ fin ›
Les echos servent à voir qu’il exécute bien du début à la fin. L’exécution se passe sans soucis et l’image est créée.
Maintenant, je crée un fichier php :
<?php
$output = shell_exec("echo 'debut' && cd /var/www/html/steeve/ && ls -lart && python /var/www/html/steeve/correction_RST_BD_BO.py && echo 'fin'") ;
print "$output";
?>
Dans un shell, je lance php test.php depuis le répertoire steeve et tout fonctionne correctement.
Le problème vient maintenant. Mon ip est 138.231.yy.xx. Depuis un navigateur, je tape http://138.231.yy.xx/steeve/test.php
J’ai un message qui affiche « début » puis le résultat de ls -lart mais il n’exécute pas mon fichier .py et je n’ai jamais le message « fin ». L’image n’est pas non plus créée.
Je suis vraiment à court d’idée pour comprendre ce qu’il se passe.
Auriez vous un peu d’aide à m’apporter?
Merci
# Durée, mémoire...?
Posté par ted (site web personnel) . Évalué à 5.
Est ce que tu as regardé dans les logs d'Apache si il y a une info? Regarde dans
/var/log/apache/error.log
Sinon, il se peut que cela vienne de ta configuration. Il faut savoir que la configuration n'est pas la même pour PHP lancé dans un shell et celui lancé par Apache: tu as différents fichiers php.ini. Il y a peut être une limite dans
/etc/php/8.0/apache2/php.ini
qui pose problème (temps d'exécution, mémoire maxi…).Un LUG en Lorraine : https://enunclic-cappel.fr
[^] # Re: Durée, mémoire...?
Posté par ojeda . Évalué à 1.
Bonjour, merci pour la réponse.
J'ai regardé /var/log/apache/error.log :
Ce que j'en retiens est que le python qui est lancé dans apache n'est pas le même que le python shell.
Pourtant je précise bien :
et donc le chemin de python… argggg. Surtout que depuis un shell cette ligne fonctionne…/usr/bin/python /var/www/html/steeve/correction_RST_BD_BO.py
Sinon dans error.log.1 j'avais :
Vous avez des conseils?[Wed Jun 15 08:42:33.439356 2022] [mpm_prefork:notice] [pid 657] AH00171: Graceful restart requested, doing restart AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
[^] # Re: Durée, mémoire...?
Posté par Anonyme . Évalué à 4.
ou qu'une variable d'environnement permettant à python de trouver ses modules est présente et associée à la bonne valeur dans ton shell et pas dans ton environnement apache
[^] # Re: Durée, mémoire...?
Posté par ojeda . Évalué à 1.
Comment peux t'on vérifier cela?
J'avoue être pas très fort là dessus…
[^] # Re: Durée, mémoire...?
Posté par Anonyme . Évalué à 3.
rajoute la commande
env
dans ton shell_exec et compare sa sortie à celle obtenue lorsque tu exécutesenv
dans ton shell[^] # Re: Durée, mémoire...?
Posté par ojeda . Évalué à 1.
Merci.
Effectivement, les deux environnements ne sont pas les mêmes.
J'ai fait un test en modifiant mon fichier .py pour n'appeler que des bibliothèques natives. Et dans ce cas tout fonctionne très bien.
Ce qu'il me reste à trouver est comment imposer à apache2 qu'il utilise /usr/bin/python pour python… aille aille…
[^] # Re: Durée, mémoire...?
Posté par Anonyme . Évalué à 3.
C'est normal que ce ne soit pas les mêmes, mais ça ne veut pas forcément dire que le problème vienne de là.
En PHP, putenv te permet d'injecter une variable d'environnement pour le temps d’exécution de ton script. Par contre je ne sais pas si shell_exec utilise le même environnement ou en génère un qui est propre à la commande que tu lui passes en argument.
Poste la sortie de tes deux environnements ici, en faisant attention de cacher les données qui pourraient être sensibles.
[^] # Re: Durée, mémoire...?
Posté par ojeda . Évalué à 1.
Pfiouuuu, pas facile! Merci pour ton aide!
Pour l’environnement à partir du fichier php lancé par php test.php :
Pour l’environnement à partir du fichier php lancé par http://localhost/test.php :LANGUAGE=fr_FR.UTF-8
USER=raspberry
XDG_SEAT=seat0
TEXTDOMAIN=Linux-PAM
SSH_AGENT_PID=769
XDG_SESSION_TYPE=x11
SHLVL=0
HOME=/home/raspberry
OLDPWD=/var/www/html/steeve
DESKTOP_SESSION=LXDE-pi
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
COLORTERM=truecolor
QT_QPA_PLATFORMTHEME=qt5ct
LOGNAME=raspberry
_=/bin/sh
XDG_SESSION_CLASS=user
TERM=xterm-256color
XDG_SESSION_ID=1
SAL_USE_VCLPLUGIN=gtk3
PATH=/home/raspberry/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/bin:/usr/local/games:/usr/games
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_MENU_PREFIX=lxde-pi-
XDG_RUNTIME_DIR=/run/user/1000
DISPLAY=:0
LANG=fr_FR.UTF-8
XDG_CURRENT_DESKTOP=LXDE
XDG_CONFIG_HOME=/home/raspberry/.config
XDG_SESSION_DESKTOP=lightdm-xsession
XAUTHORITY=/home/raspberry/.Xauthority
SSH_AUTH_SOCK=/tmp/ssh-beG4hZo3fbXX/agent.712
XDG_GREETER_DATA_DIR=/var/lib/lightdm/data/raspberry
SHELL=/bin/bash
NO_AT_BRIDGE=1
GDMSESSION=lightdm-xsession
_LXSESSION_PID=712
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
XDG_VTNR=7
PWD=/var/www/html/steeve
LC_ALL=fr_FR.UTF-8
XDG_CONFIG_DIRS=/etc/xdg
XDG_DATA_DIRS=/usr/share/fkms:/usr/local/share:/usr/share/raspi-ui-overrides:/usr/share:/usr/share/gdm:/var/lib/menu-xdg
VTE_VERSION=6203
LANGUAGE=fr_FR.UTF-8
APACHE_RUN_DIR=/var/run/apache2
APACHE_PID_FILE=/var/run/apache2/apache2.pid
JOURNAL_STREAM=8:90466
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
INVOCATION_ID=f0945bc606b940f783c880efbb19b0fe
APACHE_LOCK_DIR=/var/lock/apache2
LANG=C
APACHE_RUN_USER=www-data
APACHE_RUN_GROUP=www-data
APACHE_LOG_DIR=/var/log/apache2
PWD=/var/www/html/steeve
[^] # Re: Durée, mémoire...?
Posté par Anonyme . Évalué à 2.
je ne vois rien de particulier qui affecterait l’exécution de ton code python
si un
dans ton code php résout le problème, alors c'est tout bon. Sinon, je n'ai pas d'autres idées pour le moment.
Sur ma debian, le path adéquat est
/usr/lib/python3.10
, à voir en fonction de ce que propose rasbian.[^] # Re: Durée, mémoire...?
Posté par ojeda . Évalué à 1.
Mince, aucun changement. C'est hyper frustrant car je ne dois pas être loin.
J'ai rajouté
C'est là ou se trouve le package "control" que j'utilise, c'est là que pip installe les packages.putenv('PYTHONPATH=/home/raspberry/.local/lib/python3.9/site-packages/control')
Merci pour tous ces conseils
[^] # Re: Durée, mémoire...?
Posté par fearan . Évalué à 5.
faut aussi s'assurer que le serveur ait le droit de lire dans le home directory en question… j'aurais tendance à dire que c'est généralement une mauvaise idée d'avoir un serveur pouvant lire partout mais c'est un autre problème :)
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: Durée, mémoire...?
Posté par ojeda . Évalué à 1.
Bonjour,
Merci pour le retour. Tu veux dire qu'il faudrait que je donne les droits d'accès (lecture) à www-data pour le répertoire /home/raspberry/.local/lib/python3.9/site-packages/control?
[^] # Re: Durée, mémoire...?
Posté par fearan . Évalué à 3.
lecture et exécution sur les dossiers contenant les modules, et aussi sur les fichiers
Le droit d’exécution tout court sur les dossier intermédiaires (le droit d'exécution permet de traverser le dossier, la lecture de lister son contenu)
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: Durée, mémoire...?
Posté par Anonyme . Évalué à 2. Dernière modification le 15 juin 2022 à 16:16.
essaye plutot :
[^] # Re: Durée, mémoire...?
Posté par ojeda . Évalué à 1.
Malheureusement, pas de changement.
Je vais voir si je fais le test sur un vrai linux et pas de raspberry pour voir si j'obtiens autre chose.
[^] # Re: Durée, mémoire...?
Posté par Philippe Makowski (site web personnel) . Évalué à 1.
ce ne serait pas plutôt :
putenv('PYTHONPATH=/home/raspberry/.local/lib/python3.9/site-packages/');
[^] # Re: Durée, mémoire...?
Posté par ojeda . Évalué à 3. Dernière modification le 17 juin 2022 à 11:21.
Merci à tous pour vos conseils.
Je viens d’arriver à faire marcher tout cela. Le problème était de rajouter :
putenv('PYTHONPATH=/home/raspberry/.local/lib/python3.9/site-packages/');
C'est super!!! :)
[^] # Re: Durée, mémoire...?
Posté par Anonyme . Évalué à 2. Dernière modification le 15 juin 2022 à 15:05.
ajoute "which python" dans ton shell_exec pour vérifier que l'environnement shell et l'environnement apache utilise bien les mêmes exécutables
[^] # Re: Durée, mémoire...?
Posté par ojeda . Évalué à 1.
Avec which python ca me donne /usr/bin/python … C'est fou car c'est le même que dans le bash…
[^] # Re: Durée, mémoire...?
Posté par zurvan . Évalué à 3.
les binaires sont les mêmes, c'est juste au niveau du chemin vers les bibliothèques python que ton serveur web a un problème
« Le pouvoir des Tripodes dépendait de la résignation des hommes à l'esclavage. » -- John Christopher
[^] # Re: Durée, mémoire...?
Posté par ojeda . Évalué à 2.
Merci.
Je vais essayer de regarder de ce coté là.
Sinon, j'ai une solution qui fonctionne : je n'utilise plus la bibliothèque control. J'en ai besoin pour un calcul mais qui peut se faire à la "main". Du coup, une fois que j'enlève le "import control" ca passe crème! Bon, ce n'est pas une vraie solution mais pour le moment je n'ai pas mieux.
# et path!
Posté par guitou . Évalué à 5.
Hello
Comme le laisse entendre le titre, tu as probablement un souci de PATH. Essaie avec le chemin complet de l'executable python…
++
Gi)
[^] # Re: et path!
Posté par ojeda . Évalué à 1.
Merci pour la réponse.
J'ai essayé mais ce n'est pas cela.
# PHP, qui appelle python, qui appelle ....
Posté par totof2000 . Évalué à 2. Dernière modification le 16 juin 2022 à 15:03.
Personnellement c'est le genre de truc qui m'inquiète est est source de problèmes. Après tu fais ce que tu veux … mais en général c'est le genre de truc qui tourne vite en plat de nouilles.
N'est il pas possible de tout faire en PHP ou en python ? Au pire, si tu ne peux pas uniformiser, ne pourrais-tu pas instancier un serveur d'API Python (Flask ?) qui serait appelé par ton prog PHP ?
[^] # Re: PHP, qui appelle python, qui appelle ....
Posté par ojeda . Évalué à 2. Dernière modification le 17 juin 2022 à 11:21.
Bonjour,
Pour poser le décors, je suis dans une université et nous avons beaucoup de salles de manipulation expérimentales. Avec le covid nous avons souhaité rendre ces manipulations faisables à distance. Un collègue a crée un serveur où les étudiants se connectent. Ce serveur sert d’interface. Ils peuvent choisir l’expérience à réaliser et les paramètres de cette expérience. Moi, j’ai un raspberry qui va piloter les expériences dans une salle en python ou c ou… Il me faut donc un programme php qui va lancer le script python de l’expérience. Ce script lance l’expérience et récupère les données qui sont ensuite transmises au serveur puis du serveur aux étudiants.
Mon cadre étant donc très contraint.
J’espère à l’avenir faire mieux que ce que j’ai actuellement et qui est un peu bricolage!
Merci
[^] # Re: PHP, qui appelle python, qui appelle ....
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 4.
Ce que totof veut dire, c'est que si t'es à l'aise en PHP alors fais y directement tes manipulations et développe les scripts appelés dans ce langage. Si c'est plutôt Python votre dada, alors ça sait faire facilement du web aussi (pour débuter regarde du côté de Flask…) La raison de sa remarque est que bien qu'en restant dans un seul écosystème ce n'est pas simple mais si on les multiplie par des branchements dans tous les sens on augmente dangereusement la surface d'attaque (et plus de la difficulté de maintenance et les soucis d'interopérabilité que tu commences à effleurer avec ce post.)
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.