从PHP传递有效路径给Python
我有一个用Python写的程序,它可以解析文件。这个程序需要一个路径作为参数,然后会解析这个路径下的所有文件和子目录,使用的是os.walk(path)
。我想从我的PHP网页应用中调用这个程序,这样用户就可以指定一个路径,然后这个路径会作为参数传给解析器。(传递路径是可以的,因为都是在内部网络上)
我可以顺利调用解析器,并且通过popen()
传递参数,但Python程序接收到的路径总是无效。我让PHP脚本把它发送的命令输出到浏览器。如果我把这个命令复制粘贴到命令窗口中,解析器就能正常工作。
我知道PHP脚本传递的路径是无效的,因为在Python脚本中用os.path.exists(path)
检查后得出的结果是这样的。
这是调用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
这个输出和从命令行运行时的输出是一样的(命令是从浏览器复制并粘贴到命令窗口中的)。但是,当以这种方式运行时,路径是真实的,所有文件都被解析了。(而且在命令窗口中HTML标记也会显示)
网页服务器和解析器都托管在我的本地机器上。
1 个回答
先看看PHP服务器是以哪个用户身份在运行。如果
可以尝试的事情:
- 换个路径(我们知道
C:\Workspaces\parsers\src\main\
是可以用的,为什么不试试这个呢?)