script integrar from enviar ejecutar desde datos con php python linux exec archlinux

integrar - execute python from php



Ejecutar un script de Python desde PHP (7)

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:

  • Utilicé python2 , /usr/bin/python2 y python2.7 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 que el 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.


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


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

Luego usé sudo chown www-data:root scripts y sudo chown www-data:root test.py

Luego fui al nuevo directorio de scripts y usé 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!


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'');


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 el botón IR . 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");


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 el archivo de Python test.py , verifique este texto en la primera línea: (vea explicaciones shebang) :

#!/usr/bin/env python

Además, el archivo Python debe 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". Además, todos los comandos en el archivo .py deben tener privilegios correctos.

chmod +x myscript.py


Recomiendo usar passthru y manejar el buffer de salida directamente:

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


Si desea conocer el estado de devolución del comando y obtener el resultado completo de stdout , puede usar exec :

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

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

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