Pregunta Ejecutar un script de Python desde PHP


Estoy intentando ejecutar un script de Python desde PHP usando el siguiente comando:

exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');

Sin embargo, PHP simplemente no produce ningún resultado. Los informes de errores están configurados en E_ALL y display_errors está activado.

Esto es lo que he intentado:

  • solía python2, /usr/bin/python2 y python2.7 en lugar de /usr/bin/python2.7
  • También utilicé una ruta relativa en lugar de una ruta absoluta que tampoco cambió nada.
  • Intenté usar los comandos exec, shell_exec, system.

Sin embargo, si corro

if (exec('echo TEST') == 'TEST')
{
    echo 'exec works!';
}

funciona perfectamente bien mientras shutdown now no hace nada

PHP tiene los permisos para acceder y ejecutar el archivo.

EDITAR: Gracias a Alejandro, pude solucionar el problema. Si tiene el mismo problema, no olvide que su servidor web probablemente / afortunadamente no se ejecute como root. Intente iniciar sesión como el usuario de su servidor web o como un usuario con permisos similares e intente ejecutar los comandos usted mismo.


73
2017-11-01 20:54


origen


Respuestas:


Probado en Ubuntu Server 10.04. Espero que te ayude también en Arch Linux.

En PHP:

<?php 

$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;

?>

En archivo Python test.py, verifique este texto en la primera línea: (ver shebang explicar):

#!/usr/bin/env python

También archivo de Python debería tener privilegios correctos (ejecución para el usuario www-data / apache si el script PHP se ejecuta en el navegador o mediante curl) y / o debe ser "ejecutable". También todos los comandos en .py el archivo debe tener los privilegios correctos.

chmod +x myscript.py

110
2017-11-01 22:34



Recomiendo usar passthru y manejando el buffer de salida directamente:

ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean(); 

15
2017-11-01 22:38



Si desea conocer el estado de devolución del comando y obtener la totalidad stdout salida usted poder realmente uso exec:

$command = 'ls';
exec($command, $out, $status);

$out es una matriz de todas las líneas. $status es el estado de retorno. Muy útil para la depuración.

Si también quieres ver el stderr salida puede jugar con proc_open o simplemente agrega 2>&1 para usted $command. Esto último a menudo es suficiente para que las cosas funcionen y mucho más rápido para "implementar".


11
2017-09-18 18:19



Alejandro lo clavó, y agregó una aclaración a la excepción (Ubuntu o Debian) - No tengo el representante para agregar a la respuesta en sí:

archivo sudoers: sudo visudo

excepción agregada: www-data ALL=(ALL) NOPASSWD: ALL


8
2017-07-27 22:19



En mi caso, necesitaba crear una nueva carpeta en el www directorio llamado scripts. Dentro scripts Agregué un nuevo archivo llamado test.py.

Entonces utilicé sudo chown www-data:root scripts y sudo chown www-data:root test.py.

Luego fui a la nueva scripts directorio y usado sudo chmod +x test.py.

Mi archivo test.py se ve así. Tenga en cuenta la diferente versión de Python:

#!/usr/bin/env python3.5
print("Hello World!")

Desde php ahora hago esto:

$message = exec("/var/www/scripts/test.py 2>&1");
print_r($message);

Y deberías ver: ¡Hola mundo!


2
2018-03-02 17:43



Esto es muy trivial, pero solo quería ayudar a cualquiera que ya haya seguido la sugerencia de Alejandro pero haya encontrado este error:

sh: blabla.py: comando no encontrado

Si alguien encontró ese error, entonces Alejandro debe hacer un pequeño cambio al archivo php:

$command = escapeshellcmd('python webScraping.py');

0
2018-05-29 17:37



Los métodos anteriores parecen ser complejos. Usa mi método como referencia.

Tengo estos dos archivos

run.php

mkdir.py

Aquí, he creado una página html que contiene IR botón. Cada vez que presione este botón, se creará una nueva carpeta en el directorio cuya ruta ha mencionado.

run.php

<html>
 <body>
  <head>
   <title>
     run
   </title>
  </head>

   <form method="post">

    <input type="submit" value="GO" name="GO">
   </form>
 </body>
</html>

<?php
	if(isset($_POST['GO']))
	{
		shell_exec("python /var/www/html/lab/mkdir.py");
		echo"success";
	}
?>

mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");

0
2018-06-20 11:08