2008-10-03 61 views
72

Tengo un script de Python. Recientemente escribí 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.Llamar a Python en PHP

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

¿Alguna idea mejor? ¡Gracias por adelantado!

Respuesta

96

Según lo que esté haciendo, system() o popen() pueden ser perfectos. Use system() si el script de Python no tiene salida, o si desea que el resultado del script 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 ambas, consulte proc_open(), pero con la comunicación bidireccional entre programas, debe tener cuidado para 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, 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 haz que tu programa ejecute comandos arbitrarios contra tu voluntad.

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

preg_replace('/[^a-zA-Z0-9]/', '', $str) 
+0

¡Muchas gracias! Eso fue muy completo –

+1

El módulo de subproceso ha reemplazado usando os.Popen [n] directamente. Deberías usar eso en su lugar. –

+5

@ Nick Stinemates: Estamos hablando de funciones PHP;) – Glaslos

7

hago este tipo de cosas todo el tiempo de Quick- y scripts sucios. Es bastante común tener un script CGI o PHP que solo usa el sistema/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.

15

También hay una extensión de PHP: Pip - Python in PHP, que nunca he intentado, pero lo tenía bien marcado por una ocasión como

+7

Tenga en cuenta que el nombre "pip" también se utiliza 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. Tal vez es por eso que no se ha actualizado durante tanto tiempo. – GregD

+2

Parece que todavía está en funcionamiento (sin opción de nombre incorrecto) https://github.com/jparise/php-python – benekastah

11

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

Básicamente, usted tiene que llamar a la secuencia de comandos de Python 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 el que el código Python, no se da salida a los resultados en el navegador.

Para los códigos completos de trabajo, visite How to execute python script from php and show output on browser

+0

Cómo especificar la ruta aquí relativa y absoluta. Básicamente, tengo mi script de python presente en la carpeta de let dice 'tempmon' y la misma carpeta contiene mi script de python. Quiero que la aplicación sea portátil, así que solo copie la carpeta 'tempmon' bajo' htdocs'. Y lo mismo debería funcionar en diferentes máquinas. –

+0

Perfectamente trabajado. Puede añadir etiquetas de apertura y cierre php para una mejor comprensión de principiante – zHs

24

El operador comilla inversa también le permitirá ejecutar scripts Python usando una sintaxis similar a la anterior

En un archivo de Python llamada python.py:

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

En un archivo php llamado python.php:

$python = `python python.py`; 
echo $python; 
+2

ingeniosamente simple y funciona! – atmelino

-1

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

exec('your script python.py') 
2

Su call_python_file.php debería tener este aspecto:

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

Esto ejecuta el script python y envía el resultado al navegador. Mientras está en su script de python, la variable (sys.argv [1:]) traerá todos sus argumentos. Para mostrar el argv como una cadena de dondequiera que su PHP está tirando de modo que si usted quiere hacer un área de texto:

import sys 

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

def main(): 
    print list1 

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

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