我有一个Python程序,它解析文件,以路径作为参数,并解析给定路径和所有子目录中的所有文件-使用os.walk(path)
。我想从我的php Web应用程序中调用它,这样用户就可以指定一个路径,然后将其作为参数传递给解析器。(传递一个路径是可以的,因为它都在内部网络上)。
我可以很好地调用解析器并使用popen()
传递参数,但是Python程序接收到的路径总是无效的。我已经让php脚本输出它发送到浏览器的命令。如果我将该命令复制并粘贴到命令窗口中,解析器将正常工作。
从Python脚本
中os.path.exists(path)
的结果我知道php脚本传递的路径是无效的这是调用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标记)
web服务器和解析器托管在我的本地机器上。
检查PHP服务器以什么用户身份运行。如果I:'
是一个网络驱动器,不要期望在该用户下映射这些驱动器。请使用UNC路径。
尝试:
- 一个不同的路径(我们知道
C:'Workspaces'parsers'src'main'
工作,为什么你不试试呢?)