Forum Linux.général Problème d’exécution d'un code python depuis une page php

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
2
14
juin
2022

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  (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  . Évalué à 1.

      Bonjour, merci pour la réponse.

      J'ai regardé /var/log/apache/error.log :

      [Wed Jun 15 08:42:33.516628 2022] [mpm_prefork:notice] [pid 657] AH00163: Apache/2.4.53 (Debian) configured—resuming normal operations
      [Wed Jun 15 08:42:33.516787 2022] [core:notice] [pid 657] AH00094: Command line: '/usr/sbin/apache2'
      Traceback (most recent call last):
      File "/var/www/html/steeve/correction_RST_BD_BO.py", line 20, in
      import control as ctl # Pour l'automatique
      ModuleNotFoundError: No module named 'control'

      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 :

      /usr/bin/python /var/www/html/steeve/correction_RST_BD_BO.py
      et donc le chemin de python… argggg. Surtout que depuis un shell cette ligne fonctionne…

      Sinon dans error.log.1 j'avais :

      [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
      Vous avez des conseils?

      • [^] # Re: Durée, mémoire...?

        Posté par  . Évalué à 4.

        Ce que j'en retiens est que le python qui est lancé dans apache n'est pas le même que le python shell.

        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  . É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  . Évalué à 3.

            rajoute la commande env dans ton shell_exec et compare sa sortie à celle obtenue lorsque tu exécutes env dans ton shell

            • [^] # Re: Durée, mémoire...?

              Posté par  . É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  . É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  . Évalué à 1.

                  Pfiouuuu, pas facile! Merci pour ton aide!

                  Pour l’environnement à partir du fichier php lancé par php 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
                  Pour l’environnement à partir du fichier php lancé par http://localhost/test.php :

                  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  . Évalué à 2.

                    je ne vois rien de particulier qui affecterait l’exécution de ton code python
                    si un

                    putenv('PYTHONPATH=/path/to/python/modules');

                    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  . Évalué à 1.

                      Mince, aucun changement. C'est hyper frustrant car je ne dois pas être loin.

                      J'ai rajouté

                      putenv('PYTHONPATH=/home/raspberry/.local/lib/python3.9/site-packages/control')
                      C'est là ou se trouve le package "control" que j'utilise, c'est là que pip installe les packages.

                      Merci pour tous ces conseils

                      • [^] # Re: Durée, mémoire...?

                        Posté par  . É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  . É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  . É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  . Évalué à 2. Dernière modification le 15 juin 2022 à 16:16.

                        essaye plutot :

                        putenv('PYTHONPATH=/home/raspberry/.local/lib/python3.9/');
                        • [^] # Re: Durée, mémoire...?

                          Posté par  . É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  (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  . É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  . É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  . É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  . É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  . É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  . É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  . Évalué à 1.

      Merci pour la réponse.

      J'ai essayé mais ce n'est pas cela.

  • # PHP, qui appelle python, qui appelle ....

    Posté par  . É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  . É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  (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.