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/python2y enpython2.7lugar 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 nowno 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
.pyarchivo 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
passthruy manejar el búfer de salida directamente:fuente
Si desea conocer el estado de retorno del comando y obtener el
stdoutresultado completo , puede usarexec:$outes una matriz de todas las líneas.$statuses el estado de devolución. Muy útil para depurar.Si también desea ver la
stderrsalida, puede jugar con proc_open o simplemente agregar2>&1a 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 visudoexcepción agregada:
www-data ALL=(ALL) NOPASSWD: ALLfuente
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
wwwdirectorio llamadoscripts. Dentroscriptsagregué un nuevo archivo llamadotest.py.Luego usé
sudo chown www-data:root scriptsysudo chown www-data:root test.py.Luego fui al nuevo
scriptsdirectorio 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