Partage
  • Partager sur Facebook
  • Partager sur Twitter

php shell() function not executing Python script

    17 mai 2021 à 14:18:50

    Bonjour ! 

    Je suis un peu désespéré par ce problème que j'essaie de résoudre depuis plusieurs jours maintenant.

    J'essaie d'exécuter un script Python à partir de la fonction exec() de php. Le script est appelé mais le travail d'impression n'est jamais exécuté.

    Ce processus fonctionne depuis plusieurs années et, sans raison précise, il a soudainement cessé de fonctionner.

    Sur mon ordinateur personnel, il fonctionne sans aucun problème. Dans ma machine virtuelle, rien ne se passe. Les fonctions print() présentes dans le script sont bien affichées par la valeur de retour reçue par php mais l'impression n'est pas exécutée.

    La machine virtuelle est un environnement de test, en production c'est aussi une machine physique.

    PHP

    <?php
        exec("py C:\xampp\htdocs\test\test.py", $out, $res);
        echo "<pre>";
            print_r($out);
        echo "</pre>";
        echo "<pre>";
            print_r($res);
        echo "</pre>";
    ?>

    PYTHON

    if __name__ == "__main__":
        try:
            filename = "C:/xampp/htdocs/test/test.pdf"
            win32api.ShellExecute(0, "print", filename, None, ".", 0)
        except Exception as e:
            print(f "An error occured during print_pdf : {e}")

    Les deux environnements sont approximativement les mêmes :

    • Build 1909
    • Python 3.9.5
    • Apache 2 & php > 7
    • local user member of the administrators group
    • local user owner of the apache2 service
    • Same printer configured by default

    Je tiens à préciser que l'exécution du script directement à partir de la CLI fonctionne sur les deux machines.

    Sur la machine problématique, exec() ne renvoie que le résultat de print(..) J'ai déjà ouvert un fil de discussion il y a quelques mois à propos de ce problème mais je n'ai reçu aucune réponse.

    Merci d'avance.

    -
    Edité par Yanover 17 mai 2021 à 14:31:52

    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2021 à 11:44:19

      Salut,

      Sur ta VM, tu reçois le message de l'exception uniquement en sortie sur ton PHP ? Si c'est le cas, c'est que ton python est bien exécuté non ?

      Tu as essayé avec shell_exec() ? Est-ce que tu es sûre que ta variable d'environnement PATH indique correctement le chemin de l'exécutable python ? Que ton script PHP à les permissions nécessaires ?

      • Partager sur Facebook
      • Partager sur Twitter
        19 mai 2021 à 10:08:52

        Bonjour,

         Merci d'avoir pris le temps de me répondre !

        Plusieurs choses : 

        Oui, le script Python est belle est bien exécuté, la variable $out affiche les print("...") effectués dans le script python mais certaines actions ne sont pas exécutées.

         Pour éliminer les problèmes qui pourraient être liés à l'imprimante, j'ai encore plus simplifié le script python. Il doit normalement simplement ouvrir un fichier .pdf passé en argument ().

        PHP

        try {
            // Check who is the user
            exec("whoami", $out, $res);
            echo "User from php is : $out[0]";
            // Call Python with exec
            exec("py C:\\xampp\htdocs\\test\\test.py",$out,$res);
            echo "<pre>";
            print_r($out);
            echo "</pre>";
            print_r("Script return value is : $res");
        } catch (Throwable $th) {
            echo $th;
        } 


        PYTHON

        if __name__ == "__main__":
            try:
                # Get informations
                print(f"User from Python is : {getpass.getuser()}")
                FILE_PATH = "C:/xampp/htdocs/test/test.pdf"
                os.startfile(FILE_PATH, "open")



        En exécutant le script directement depuis la ligne de commande, sans passer par PHP, celui-ci est fonctionnel, mon lecteur .pdf par défaut ouvre le fichier .pdf passé en argument. (en l'appelant avec l'interpréteur python)

         Le plus fou, c'est que si j'exécute le script php en passant par l'exécutable php.exe, ça fonctionne ! 

        $ c:/xampp/php/php.exe c:/xampp/htdocs/test/test.php --> Adobe s'ouvre !

        Depuis un navigateur, lorsque je trigger l'url http://localhost/test/test.php, le script php affiche exactement le même résultat mais adobe ne s'ouvre pas. 

        OUTPUT DEPUIS BROWSER

        User from php is : domain\john

        Array
        (
            [0] => domain\john
            [1] => User from Python is : john
        )
        
        Script return value is : 0

         Pour essayer d'isoler un problème de droit, j'ai utilisé la librairie getpass() pour voir si l'utilisateur qui exécute le script Python est bien le même dans tous les cas d'utilisations. 

        Mon service apache24 est configuré pour utiliser un compte spécifique, le même que celui avec lequel j'ai effectué les différentes manipulations ci-dessus. Ce compte est administrateur local de la machine.

        Comme Python est installé par utilisateur, si je change l'exploitant du service, je remarque que dans les log c:/xampp/apache/log/error.log apache me signal qu'il ne trouve pas Python, dans le cas ou le bon utilisateur est référencé, aucune erreur n'est spécifiée dans ce fichier. Ce comportement me semble logique, donc oui, le script python est bien exécuté avec un utilisateur membre du groupe administrateurs.

        En espérant avoir donné suffisamment de détail .. 

        Merci d'avance ! 

        -
        Edité par Yanover 19 mai 2021 à 10:11:11

        • Partager sur Facebook
        • Partager sur Twitter
          19 mai 2021 à 11:46:58

          Pourtant ca ressemble à un cas ou le user du python n'a pas les droits d'exécution, donc le script se lance mais tu il n'a pas le droit de lancer un autre programme. C'est drôle mais ce genre de cas serait plus simple à régler sur Linux pour le coup :D, je n'ai pas d'idée bien précise pour t'aider..
          • Partager sur Facebook
          • Partager sur Twitter
            19 mai 2021 à 12:06:48

            Ouais, je me doute que sur Linux on pourrai cibler le problème plus facilement ..

            Malheureusement, l'application en production tourne sous Windows et le serveur envoi des jobs d'impressions complexes à des imprimantes qui n'ont même pas de driver multi-os (imprimante à cartes plastifiées). Passé sous Linux n'est pas une solution. :D 

            merci quand même, si quelqu'un d'autre à la moindre suggestion de débugging .. je prends :) 

            • Partager sur Facebook
            • Partager sur Twitter

            php shell() function not executing Python script

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown