Estoy tratando de 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 probé:
- Usé
python2
,/usr/bin/python2
y enpython2.7
lugar de/usr/bin/python2.7
- También utilicé una ruta relativa en lugar de una ruta absoluta que tampoco cambió nada.
- He intentado utilizar 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 / con suerte no se ejecute como root. Intente iniciar sesión como usuario de su servidor web o un usuario con permisos similares e intente ejecutar los comandos usted mismo.
Respuestas:
Probado en Ubuntu Server 10.04. Espero que te ayude también en Arch Linux.
En PHP use la función shell_exec :
En el archivo Python
test.py
, verifique este texto en la primera línea: (vea la explicación de shebang) :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". Además, todos los comandos en el
.py
archivo deben tener los privilegios correctos:Tomado del manual de php :
Para convertir un archivo en ejecutable en plataformas de tipo Unix :
fuente
echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py");
o:echo shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
Recomiendo usar
passthru
y manejar el búfer de salida directamente:fuente
Si desea conocer el estado de retorno del comando y obtener el
stdout
resultado completo , puede usarexec
:$out
es una matriz de todas las líneas.$status
es el estado de devolución. Muy útil para depurar.Si también desea ver la
stderr
salida, puede jugar con proc_open o simplemente agregar2>&1
a su archivo$command
. Esto último suele ser suficiente para que las cosas funcionen y mucho más rápido de "implementar".fuente
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 sudoers:
sudo visudo
excepción agregada:
www-data ALL=(ALL) NOPASSWD: ALL
fuente
Para aclarar qué comando usar según la situación
exec()
- Ejecutar un programa externosystem()
- Ejecutar un programa externo y mostrar la salidapassthru()
- Ejecutar un programa externo y mostrar la salida sin procesarFuente: http://php.net/manual/en/function.exec.php
fuente
En mi caso, necesitaba crear una nueva carpeta en el
www
directorio llamadoscripts
. Dentroscripts
agregué un nuevo archivo llamadotest.py
.Luego usé
sudo chown www-data:root scripts
ysudo chown www-data:root test.py
.Luego fui al nuevo
scripts
directorio y usésudo chmod +x test.py
.Mi archivo test.py se ve así. Tenga en cuenta la versión diferente de Python:
Desde php ahora hago esto:
Y debería ver: ¡Hola mundo!
fuente
Los métodos anteriores parecen ser complejos. Usa mi método como referencia.
Tengo estos dos archivos:
ejecutar.php
mkdir.py
Aquí, he creado una página HTML que contiene un GObotón. Siempre que presione este botón se creará una nueva carpeta en el directorio cuya ruta ha mencionado.
ejecutar.php
mkdir.py
fuente
Esto es tan trivial, pero solo quería ayudar a cualquiera que ya haya seguido la sugerencia de Alejandro pero haya encontrado este error:
Si alguien encuentra ese error, entonces Alejandro debe hacer un pequeño cambio en el archivo php:
fuente