У меня есть программа Python, которая анализирует файлы, принимает путь в качестве аргумента и и анализирует все файлы по указанному пути и все подкаталоги - используя os .walk (путь)
. Я хочу вызвать это из моего веб-приложения php, чтобы пользователь мог указать путь, который затем передается в качестве аргумента синтаксическому анализатору. (Передача пути - это нормально, потому что это все во внутренней сети).
Я могу вызвать синтаксический анализатор и передать аргументы нормально, используя popen ()
, но путь, который получает программа Python, всегда недействителен. У меня есть php-скрипт, выводящий команду, которую он отправляет в браузер. Если я скопирую и вставлю эту команду в командное окно, синтаксический анализатор будет работать нормально.
Я знаю, что путь, пройденный скриптом php, недействителен из результата os.path.exists (path)
в скрипте Python
Это код для вызова программы 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>";
}
}
Команда, отображаемая в браузере, выглядит примерно так:
python C: \ Workspaces \ parsers \ src \ main \ main.py 2 "I: \ Dir1 \ Dir2 \ Dir3"
Где 2 - это просто еще один аргумент для сценарий и $ _ REQUEST ['location']
определяется из текстового поля ввода в форме на вызывающей странице.
Это в системе Windows, поэтому я предполагаю, что это как-то связано с обратными косыми чертами в пути.
В принципе, я не уверен, как обрабатываются все обратные косые черты.Я хотел бы понять, как строки, содержащие обратную косую черту, отправляются на страницу php и как они отправляются снова с помощью popen ()
. Я думаю, что результат, печатаемый в браузере, не является исходной командной строкой, и я не могу быть уверен, сколько обратных косых черт действительно присутствует в команде, выдаваемой popen ().
Если у кого-то есть идеи, я буду очень признателен.
Изменить:
Итак, в программе Python путь используется следующим образом:
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 />"
Это возвращается браузеру из переменной $ read.
Результатом этого является:
Parsing all files in directory tree I:\Dir1\Dir2\Dir3
Path is NOT REAL!!!
0 Files parsed
Это идентично выводу, если команда запускается из командной строки (команда копируется из браузера и вставляется в окно cmd). ИСКЛЮЧАЯ, когда запускается таким образом, путь ЯВЛЯЕТСЯ реальным, и все файлы анализируются. (и в окне команд также отображается разметка html)
Веб-сервер и парсеры размещены на моем локальном компьютере.