integrar - execute python from php
Ejecutar un script de Python desde PHP (7)
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. Los informes de errores están configurados en E_ALL y display_errors está activado.
Esto es lo que he intentado:
- Utilicé
python2
,/usr/bin/python2
ypython2.7
lugar de/usr/bin/python2.7
- También utilicé 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.
EDITAR: Gracias a Alejandro, pude solucionar el problema. Si tiene el mismo problema, no olvide que su servidor web probablemente / afortunadamente no se ejecute como root. Intente iniciar sesión como el usuario de su servidor web o como un usuario con permisos similares e intente ejecutar los comandos usted mismo.
Alejandro lo clavó, y agregó 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
En mi caso, necesitaba crear una nueva carpeta en el directorio www
llamada scripts
. Dentro de los scripts
, agregué un nuevo archivo llamado test.py
Luego usé 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 ve así. 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!
Esto es muy 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 al archivo php:
$command = escapeshellcmd(''python webScraping.py'');
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 el botón IR . Cada vez que presione este botón, se creará una nueva carpeta en el directorio cuya ruta ha mencionado.
run.php
<html>
<body>
<head>
<title>
run
</title>
</head>
<form method="post">
<input type="submit" value="GO" name="GO">
</form>
</body>
</html>
<?php
if(isset($_POST[''GO'']))
{
shell_exec("python /var/www/html/lab/mkdir.py");
echo"success";
}
?>
mkdir.py
#!/usr/bin/env python
import os
os.makedirs("thisfolder");
Probado en Ubuntu Server 10.04. Espero que te ayude también en Arch Linux.
En PHP:
<?php
$command = escapeshellcmd(''/usr/custom/test.py'');
$output = shell_exec($command);
echo $output;
?>
En el archivo de Python test.py
, verifique este texto en la primera línea: (vea explicaciones shebang) :
#!/usr/bin/env python
Además, el archivo Python debe tener 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". Además, todos los comandos en el archivo .py
deben tener 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 devolución del comando y obtener el resultado completo de stdout
, puede usar exec
:
$command = ''ls'';
exec($command, $out, $status);
$out
es una matriz de todas las líneas. $status
es el estado de devolución. Muy útil para la depuración.
Si también quieres ver la salida de stderr
, puedes jugar con proc_open o simplemente agregar 2>&1
a tu $command
. Esto último a menudo es suficiente para que las cosas funcionen y mucho más rápido para "implementar".