从PHP传递有效路径给Python

6 投票
1 回答
641 浏览
提问于 2025-04-17 03:47

我有一个用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 个回答

1

先看看PHP服务器是以哪个用户身份在运行。如果是一个网络驱动器,那就别指望在那个用户下能找到它。可以试试用UNC路径。

可以尝试的事情:

  • 换个路径(我们知道C:\Workspaces\parsers\src\main\是可以用的,为什么不试试这个呢?)

撰写回答