Llamar a Python en PHP

82

Tengo una secuencia de comandos de Python que escribí recientemente que llamo usando la línea de comando con algunas opciones. Ahora quiero una interfaz web muy delgada para llamar a este script localmente en mi Mac.

No quiero pasar por el pequeño problema de instalar mod_python o mod_wsgi en mi Mac, así que solo iba a hacer un system () o popen () desde PHP para llamar al script Python.

¿Alguna idea mejor? ¡Gracias por adelantado!

Benny Wong
fuente

Respuestas:

106

Dependiendo de lo que esté haciendo, system () o popen () pueden ser perfectos. Use system () si la secuencia de comandos de Python no tiene salida o si desea que la salida de la secuencia de comandos de Python vaya directamente al navegador. Utilice popen () si desea escribir datos en la entrada estándar de la secuencia de comandos de Python, o leer datos de la salida estándar de la secuencia de comandos de Python en php. popen () solo le permitirá leer o escribir, pero no ambos. Si desea ambos, consulte proc_open () , pero con la comunicación bidireccional entre programas, debe tener cuidado de evitar interbloqueos, donde cada programa espera que el otro haga algo.

Si desea pasar los datos proporcionados por el usuario a la secuencia de comandos de Python, entonces lo más importante a tener en cuenta es la inyección de comandos. Si no tiene cuidado, su usuario podría enviarle datos como "; evilcommand;" y hacer que su programa ejecute comandos arbitrarios en contra de su voluntad.

escapeshellarg () y escapeshellcmd () pueden ayudar con esto, pero personalmente me gusta eliminar todo lo que no es un buen personaje conocido, usando algo como

preg_replace('/[^a-zA-Z0-9]/', '', $str)
Andru Luvisi
fuente
1
El módulo de subproceso ha sido reemplazado usando os.Popen [n] directamente. Deberías usar eso en su lugar.
Nick Stinemates
6
@Nick Stinemates: Estamos hablando de funciones PHP;)
Glaslos
¿No hay soluciones que NO involucren un shell, como execve () de C, excepto que se ejecuta en un proceso separado en lugar de tener que fork () primero?
Lie Ryan
Siempre ha habido soluciones, pero debes ejecutar Python en algún lugar para sacar algo de él. Puede crear un servicio de Python simple que solo espera la entrada hasta que tenga alguna o podría activar su programa de alguna manera (linux inotify, por ejemplo), luego están esas extensiones de PHP y luego están los sockets locales para los servidores de Linux. Python en PHP parece la mejor solución NoShell, ya que otros (sin complemento) siempre tendrían algún tipo de shell alrededor de su python.
Sampo Sarrala - codidact.org
27

El operador de comillas inversas también le permitirá ejecutar scripts de Python con una sintaxis similar a la anterior.

En un archivo de Python llamado python.py:

hello = "hello"
world = "world"
print hello + " " + world

En un archivo php llamado python.php:

$python = `python python.py`;
echo $python;
usuario
fuente
15

También hay una extensión de PHP: Pip - Python en PHP , que nunca probé, pero la tenía marcada para tal ocasión.

enobrev
fuente
11
Tenga en cuenta que el nombre "pip" también se usa para describir la herramienta de administración de paquetes Python extremadamente popular y bastante estándar, por lo que este es un nombre realmente malo, confuso y condenado para esta herramienta PHP. Quizás por eso no se ha actualizado durante tanto tiempo.
GregD
2
Parece que todavía funciona (sin una mala elección de nombre) github.com/jparise/php-python
benekastah
11

Puede ejecutar un script de Python a través de php y salidas en el navegador.

Básicamente, debes llamar al script de Python de esta manera:

$command = "python /path/to/python_script.py 2>&1";
$pid = popen( $command,"r");
while( !feof( $pid ) )
{
 echo fread($pid, 256);
 flush();
 ob_flush();
 usleep(100000);
}
pclose($pid);

Nota: si ejecuta cualquier time.sleep () en su código Python, no mostrará los resultados en el navegador.

Para que los códigos completos funcionen, visite Cómo ejecutar un script de Python desde php y mostrar la salida en el navegador

Mente ideal
fuente
Cómo especificar la ruta aquí relativa y absoluta. Básicamente, tengo mi script de Python presente en la carpeta, digamos, tempmony la misma carpeta contiene mi script de Python. Quiero que la aplicación sea portátil, así que puedo copiar la tempmoncarpeta debajo htdocs. Y lo mismo debería funcionar en diferentes máquinas.
Krishna Oza
Perfectamente trabajado. Puede agregar etiquetas php de apertura y cierre <? Php?> Para una mejor comprensión para principiantes
Zaheer
7

Hago este tipo de cosas todo el tiempo para guiones rápidos y sucios. Es bastante común tener un script CGI o PHP que solo usa system / popen para llamar a algún programa externo.

Solo tenga mucho cuidado si su servidor web está abierto a Internet en general. Asegúrese de desinfectar su entrada GET / POST en este caso para no permitir que los atacantes ejecuten comandos arbitrarios en su máquina.

Eli Courtwright
fuente
3

Su call_python_file.php debería verse así:

<?php
    $item='Everything is awesome!!';
    $tmp = exec("py.py $item");
    echo $tmp;
?>

Esto ejecuta la secuencia de comandos de Python y envía el resultado al navegador. Mientras que en su script de Python, la variable (sys.argv [1:]) traerá todos sus argumentos. Para mostrar el argv como una cadena para donde sea que su php esté extrayendo, si desea hacer un área de texto:

import sys

list1 = ' '.join(sys.argv[1:])

def main():
  print list1

if __name__ == '__main__':
    main()
Aze
fuente
0

Tenga en cuenta que si está utilizando un entorno virtual (como en el alojamiento compartido), debe ajustar su ruta a Python, por ejemplo: /home/user/mypython/bin/python ./cgi-bin/test.py

Bob3411
fuente
0

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 el botón IR. Siempre que presione este botón se creará una nueva carpeta en el directorio cuya ruta ha mencionado.

ejecutar.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");
SMshrimant
fuente
-2

Si desea ejecutar su secuencia de comandos Python en PHP, es necesario hacer este comando en su secuencia de comandos php:

exec('your script python.py')
Gouled Med
fuente
a) Espacios separados parámetros, es decir, este intenta llamar al programa yourcon los parámetros scripty python.py. b) A menos que la secuencia de comandos de Python tenga un estilo adecuado, se debe llamar al intérprete de Python y pasarle el nombre de la secuencia de comandos ( python script.py). Incluso con un shebang adecuado, esto está mal, ya que llamaría en ./script.pylugar de usar el nombre del intérprete.
Tox