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:
python2
, /usr/bin/python2
y python2.7
lugar de /usr/bin/python2.7
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