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.
¿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 ... –
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
Intente imprimir la ruta en el programa Python para ver lo que realmente recibe. –