web-dev-qa-db-fra.com

incapable d'exécuter un script python à partir de php

Je souhaite exécuter le script Python à partir du fichier PHP. Je suis capable d'exécuter un script python simple comme:

print("Hello World") 

mais quand je veux exécuter le script suivant, rien ne se passe

from pydub import AudioSegment
AudioSegment.converter = "/usr/bin/ffmpeg"
sound = AudioSegment.from_file("/var/www/dev.com/public_html/track.mp3")
sound.export("/var/www/dev.com/public_html/test.mp3", format="mp3", bitrate="96k")

et le même script fonctionne bien quand je l'exécute à partir du terminal. voici mon script php:

$output = Shell_exec("/usr/bin/python /var/www/dev.com/public_html/index.py");
echo $output;

J'ai aussi essayé la méthode suivante mais pas de chance:

$output = array();
$output = passthru("/usr/bin/python /var/www/dev.com/public_html/index.py");
print_r($output);

aidez-moi, s'il vous plaît

9
Rajinder

La fonction passthru de PHP ne possède pas la méthode élégante pour laquelle vous pouvez rechercher des variables d'environnement passantes. Si vous devez utiliser passthru, exportez vos variables directement dans la commande:

passthru("SOMEVAR=$yourVar PATH=$newPATH ... /path/to/executable $arg1 $arg2 ...")

Si vous êtes enclin à utiliser Shell_exec, vous apprécierez probablement putenv pour l’interface légèrement plus propre:

putenv("SOMEVAR=$yourVar");
putenv("PATH=$newPATH");
echo Shell_exec("/path/to/executable $arg1 $arg2 ...");

Si vous êtes ouvert à une approche plus robuste (si fastidieuse), considérez proc_open :

$cmd = "/path/to/executable arg1 arg2 ..."

# Files 0, 1, 2 are the standard "stdin", "stdout", and "stderr"; For details
# read the PHP docs on proc_open.  The key here is to give the child process a
# pipe to write to, and from which we will read and handle the "passthru"
# ourselves
$fileDescriptors = array(
    0 => ["pipe", "r"],
    1 => ["pipe", "w"],
    2 => ["pipe", "w"]
);

$cwd = '/tmp';
$env = [
    'PATH' => $newPATH,
    'SOMEVAR' => $someVar,
    ...
];

# "pHandle" = "Process handle".  Note that $pipes is new here, and will be
# given back to us
$pHandle = proc_open($cmd, $fileDescriptors, $pipes, $cwd, $env);

# crucial: did proc_open work?
if ( is_resource( $pHandle ) ) {
    # $pipes is now valid
    $pstdout = $pipes[ 1 ];

    # Hey, whaddya know?  PHP has just what we need...
    fpassthru( $pstdout );

    # Whenever you proc_open, you must also proc_close.  Just don't
    # forget to close any open file handles
    fclose( $pipes[0] );
    fclose( $pipes[1] );
    fclose( $pipes[2] );
    proc_close( $pHandle );
}
4
hunteke

Vérifie ça:

L'utilisateur Apache doit être dans le fichier sudoers, mieux vaut ne pas donner Sudo à Apache, mais plutôt donner à Apache (www-data) le droit d'exécuter votre programme python.

mettez la première ligne de votre script python: #!/usr/bin/env python afin que le script sache avec quel programme l'ouvrir.

puis,

changer de groupe:

chgrp www-data /path/to/python-script.py

le rendre exécutable:

chmod +x /path/to/python-script.py

puis essayez-le:

Shell_exec("/path/to/python-script.py");

J'espère que ça va marcher! :)

Accédez à votre réponse, comme vous voulez exécuter le script python de PHP

J'ai pu l'exécuter en utilisant le code suivant

$command = escapeshellcmd('/var/www/yourscript.py');
$output = Shell_exec($command);
echo $output;

Veuillez utiliser le code PHP ci-dessus avec le même script python. Essayez d’exécuter le script python en tant que script GCI pour vous assurer de son bon fonctionnement, puis définissez les autorisations sur le répertoire public et le script comme suit: J'ai mentionné avant

================== vieux ans ==========================

D'après ce que vous avez demandé, je suppose que c'est ce que vous essayez de faire, c'est d'essayer de l'exécuter en tant que script CGI tel que http: //localhost/yourscript.py

Et pourquoi utilisez-vous PHP pour exécuter un script Python alors que vous pouvez l'exécuter directement en tant que script CGI?

voici ce que vous devez faire pour que cela fonctionne comme une page Web:

  1. activez CGI python dans Apache (ou sur le serveur Web que vous utilisez).
  2. mettre le script dans le répertoire configuré CGI
  3. ajoutez le code approprié à votre script pour le faire fonctionner comme un script CGI
 #!/usr/local/bin/python 
 à partir de pydub import AudioSegment 
 AudioSegment.converter = "/usr/local/bin/ffmpeg"
sound = AudioSegment.from_file ("/ var/www/dev.com/public_html/track.mp3") 
 Sound.export ("/ var/www/dev.com/public_html/test.mp3", format = " mp3 ", bitrate =" 96k ") 
 
 print" Type de contenu: text/html "
 print 
 print" "
 print" "
 print" "
 print" Terminé/vous pouvez exécuter certaines conditions et imprimer des informations utiles ici "
 print" "
  1. Accorder des autorisations au script et rendre le répertoire public accessible en écriture
  2. Accédez au script http: //localhost/your-path-to-script.py

J'ai été capable de le faire correctement. Faites-moi savoir si ce n'est pas votre cas si vous voulez autre chose

1
joginder singh

Dans mon cas, j'ai fait ce code.

<?php
chdir('/home/pythontest') ; // python code dir
$commandline="/usr/bin/python3 test.py parameter" ;
exec($commandline, $output, $error) ;
echo $output ;
?>

Si vous devez définir des environnements pour Python, ajoutez des variables d'environnement telles que celle-ci.

$commmandline="LANG=en_US.utf8 LC_ALL=en_US.utf8 /usr/bin/python3 ..." ;

et consultez le journal httpd.

1
Junhee Shin

Vous pouvez aussi exécuter directement ffmpeg sans python:

$output = Shell_exec("/usr/bin/ffmpeg -i in.mp3 -b:a 96k out.mp3");
echo $output;

Documents de ffmpeg

0
iwex