Ejecutando 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. El informe de errores se establece 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 usé 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.

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

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

En PHP:

  

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

 #!/usr/bin/env python 

Además, el archivo de Python debe tener los 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 el archivo .py deben tener los 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 retorno del comando y obtener la salida de la salida stdout completa, puede utilizar 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 desea ver la salida de stderr , puede jugar con proc_open o simplemente agregar 2>&1 a su $command . Este último es a menudo suficiente para que las cosas funcionen y es más rápido para “implementar”.

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

archivo de sudoers: sudo visudo

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

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

Luego utilicé 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 parece a esto. 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!

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 un botón IR . Cada vez que presione este botón, se creará una nueva carpeta en el directorio cuya ruta mencionó.

run.php

     run   

Esto es tan 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 en el archivo php:

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

Para aclarar qué comando usar en función de la situación

exec() – Ejecuta un progtwig externo

system() – Ejecuta un progtwig externo y muestra la salida

passthru() – Ejecuta un progtwig externo y muestra la salida en bruto

Fuente: http://php.net/manual/en/function.exec.php