2011-10-06 13 views
6

Tengo un programa Python que analiza archivos, toma una ruta como argumento y analiza todos los archivos en la ruta determinada y todos los subdirectorios - usando os.walk(path). Quiero llamar a esto desde mi aplicación web php, por lo que el usuario puede especificar una ruta, que luego se pasa como un argumento para el analizador. (Pasar un camino está bien porque todo está en una red interna).Pasar una ruta válida a Python desde PHP

Puedo llamar al analizador bien y pasar los argumentos bien utilizando popen(), pero la ruta que el programa Python recibe siempre es inválida. He tenido la secuencia de comandos php salida el comando que está enviando al navegador. Si copio y pego ese comando en una ventana de comandos, el analizador funciona bien.

que conoce la ruta del script PHP pasa es válido a partir del resultado de os.path.exists(path) en la secuencia de comandos de Python

Este es el código para llamar al programa Python:

$path = $_REQUEST['location']; 
echo "Path given is: ".$path; 
$command = 'python C:\Workspaces\parsers\src\main\main.py '. intval($mode).' "'.$path.'"'; 
echo "<p>".$command."</p>"; 
$parser = popen($command, 'r'); 
if ($parser){ 
    echo "<p>Ran the program</p>"; 
    while (!feof($parser)){ 
    $read = fgets($parser); 
    if (!$read) 
     echo "<p>Reached end of file</p>";   
     else 
     echo "<p>".$read."</p>";     
    } 
    } 

El comando eco en el navegador es como:

python C:\Workspaces\parsers\src\main\main.py 2 "I:\Dir1\Dir2\Dir3"

Cuando el 2 es sólo otro argumento para el guión y $_REQUEST['location'] se define desde un cuadro de texto de entrada en un formulario en la página de llamada.

Esto es en un sistema Windows, así que supongo que esto tiene algo que ver con las barras diagonales inversas en la ruta.

Básicamente, no estoy seguro de cómo se manejan todas las barras invertidas. Me gustaría entender cómo se envían las cadenas que contienen barras invertidas a la página php, y cómo se envían nuevamente usando popen(). Creo que el resultado que se imprime en el navegador no es la cadena de comandos sin procesar, y no puedo estar seguro de cuántas barras invertidas realmente están en el comando que está emitiendo popen().

Si alguien tiene alguna idea, realmente la agradecería.

Editar:

Así, en el programa de Python la ruta se utiliza de la siguiente manera:

nfiles=0 
print 'Parsing all files in directory tree '+path+"<br />" 
start = time.time() 
if not os.path.exists(path): 
    print "<p>Path is NOT REAL!!!</p>" 
else: 
    print "<p>Path IS real!</p>" 
for root, dirs, files in os.walk(path): 
    for f in files: 
    file = os.path.join(root,f) 
    print file 
    nfiles+=1 
    ...Code to run parser... 
print nfiles, "Files parsed<br />" 

Esto se hizo eco de vuelta al navegador de la variable $ leer.

salida de esto es:

Parsing all files in directory tree I:\Dir1\Dir2\Dir3 
Path is NOT REAL!!! 

0 Files parsed 

Ésta es idéntica a la salida si el comando se ejecuta desde la línea de comandos (el comando que se está copiando desde el navegador y pegar en la ventana cmd). EXCEPTO, cuando se ejecuta de esa manera, la ruta ES real y todos los archivos se analizan. (y en la ventana de comandos también se muestra el marcado html)

El servidor web y los analizadores están alojados en mi máquina local.

+0

¿Es posible añadir el mensaje de error de Python? ¿Y obtener Python para imprimir el camino que recibe? Por lo que puedo decir, tu depuración de eco es de primera clase. Tu comando es correcto Ahora, dependiendo de cómo ejecute PHP, quizás la ruta realmente no sea válida. ¿El disco es "I:" en el cliente o en el servidor? Porque, bueno, * tiene * que estar en el servidor para que esto funcione ... –

+0

Deberías estar bien con las barras invertidas ya que '$ command' es un literal de cadena (definido por el uso de apóstrofes en lugar de comillas) - podrías Intentar validar la ruta en PHP con 'realpath()' antes de pasarla a la tubería de Python? Tal vez también cierre la tubería al final con 'pclose ($ analizador)' ... – CD001

+0

Intente imprimir la ruta en el programa Python para ver lo que realmente recibe. –

Respuesta

1

Compruebe a qué usuario se está ejecutando el servidor PHP. Si I:\ es una unidad de red, no espere que se mapeen bajo ese usuario. Use una ruta UNC en su lugar.

cosas para probar:

  • un camino diferente (sabemos C:\Workspaces\parsers\src\main\ obras, ¿por qué no tratar de que?)
+0

¡Tú, amigo mío, eres un genio! Ha verificado con 'C: \ bla \ bla' y funciona. Verificará con una ruta UNC para 'I: \' y volverá con los resultados ... – K4KYA

+0

He intentado con una buena ruta UNC conocida a 'I: \', pero sigo recibiendo el mismo error. Ahora estoy pensando que esto puede estar relacionado con los privilegios de la carpeta. ¿Hay alguna forma de que pueda obtener PHP para que se imprima como usuario? – K4KYA

+0

No resuelto todavía. Pero estoy razonablemente seguro de que esta es la respuesta correcta, así que lo estoy marcando como tal. ¡Gracias! – K4KYA

Cuestiones relacionadas