Recomiendo usar passthru
y manejar el búfer de salida directamente:
ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
Probado en Ubuntu Server 10.04. Espero que te ayude también en Arch Linux.
En PHP use la función shell_exec:
Ejecute el comando a través de shell y devuelva la salida completa como una cadena.
Devuelve el resultado del comando ejecutado o NULL si se produjo un error o el comando no produce ningún resultado.
<?php
$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;
?>
En el archivo Python test.py
, verifique este texto en la primera línea:(vea la explicación shebang):
#!/usr/bin/env python
Si tiene varias versiones de Python instaladas, /usr/bin/env se asegurará de que el intérprete utilizado sea el primero en el $PATH de su entorno. La alternativa sería codificar algo como #!/usr/bin/python; está bien, pero es menos flexible.
En Unix, un archivo ejecutable destinado a ser interpretado puede indicar qué intérprete usar al tener un #! al comienzo de la primera línea, seguido del intérprete (y las banderas que pueda necesitar).
Si está hablando de otras plataformas, por supuesto, esta regla no se aplica (pero esa "línea de shebang" no hace daño, y ayudará si alguna vez copia ese script a una plataforma con base Unix, como Linux, Mac, etc. ).
Esto se aplica cuando lo ejecuta en Unix haciéndolo ejecutable (chmod +x myscript.py) y luego ejecutándolo directamente:./myscript.py, en lugar de solo python myscript.py
Para hacer ejecutable un archivo en plataformas tipo Unix:
chmod +x myscript.py
Además, el archivo Python debe tener los privilegios correctos (ejecución para el usuario www-data/apache si el script PHP se ejecuta en el navegador o curl) y/o debe ser "ejecutable". También todos los comandos en .py
el archivo debe tener los privilegios correctos.
Tomado del manual de php:
Solo un recordatorio rápido para aquellos que intentan usar shell_exec en una plataforma tipo aunix y parece que no pueden hacerlo funcionar. PHP se ejecuta como el usuario web en el sistema (generalmente www para Apache), por lo que debe asegurarse de que el usuario web tenga derechos sobre cualquier archivo o directorio que esté tratando de usar en el comando shell_exec. De lo contrario, no parecerá estar haciendo cualquier cosa.
Si desea conocer el estado de retorno del comando y obtener el stdout
completo salida que puede en realidad usa 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 que puede jugar con proc_open o simplemente agregar 2>&1
a tu $command
. Esto último suele ser suficiente para que las cosas funcionen y mucho más rápido de "implementar".