exec()和传递到Python脚本的变量的问题


Problems with exec() and variables passing to a Python Script

在HTML中编写一些简单的嵌入式PHP来执行python脚本,该脚本根据HTML表单中多个文件输入的可能性使用一些循环来多次运行该脚本。它对单数很好,但就目前情况而言,当运行多个文件时,似乎会重复一些,并进行更仔细的检查,python脚本第一次接收到的变量似乎不正确。我不知道它为什么这么做,这可能非常明显。感谢所有的帮助。

$len = count($_FILES["inputFile"]["name"]);
 echo "length";
 echo $len;
 for($i = 0; $i < $len; $i++){
    $dataIn = $_FILES["inputFile"]["tmp_name"][$i];
    $originalName = $_FILES["inputFile"]["name"][$i];
    echo "TMP Name:";
    echo $dataIn;
    echo "OriginalName";
    echo $originalName;
    exec("python /home/will/public_html/OrderAnalyser.py '$dataIn' '$originalName' 2>&1",$output);
    foreach ($output as $out){
        echo $out;
        echo "<br />"; 
    }
 }

输出如下:

    Executing...
length2TMP Name:/var/www/tmp/phpHzJFtQOriginalNamemicro_b001.jsonAnalysis Starting on file:
Input File: /var/www/tmp/phpHzJFtQ
Original Name: micro_b001.json
"nodeID":20,
firstNode:
20
Finished Finding Argument Order,
List is as follows:
['20', '21', '22', '23', '24']
Top Node is:
24

There is NO subargument of node:
24

Analysis Complete
TMP Name:/var/www/tmp/php9vQumSOriginalNamemicro_b002.jsonAnalysis Starting on file:
Input File: /var/www/tmp/phpHzJFtQ
Original Name: micro_b001.json
"nodeID":20,
firstNode:
20
Finished Finding Argument Order,
List is as follows:
['20', '21', '22', '23', '24']
Top Node is:
24

There is NO subargument of node:
24

Analysis Complete
Analysis Starting on file:
Input File: /var/www/tmp/php9vQumS
Original Name: micro_b002.json
"nodeID":20,
firstNode:
20
Finished Finding Argument Order,
List is as follows:
['20', '21', '22', '23', '24']
Top Node is:
22

20
is child of
22

21
is child of
22

Subargument of node:
22
is:
Post Order

There is NO subargument of node:
20

There is NO subargument of node:
21

Analysis Complete
Completed...

从这里可以看出,一旦它完成了第一个文件(micro_b001.json),它就应该移到micro_b002上。PHP中的echo显示PHP中的变量是正确的,但从python脚本中看到的print显示它使用初始变量(micro_b001)再次运行。为什么会发生这种情况?正如你所看到的,一旦它出于某种原因再次运行了第一个,它就会正确地运行第二个,然后完成。为什么它会做这种奇怪的重复?我就是想不通。

(此外,我意识到这是易受攻击的代码等,现在并不重要)

(按设计断开)exec函数将命令的输出附加到给定数组:

参数

output

如果存在output参数,则指定的数组将填充该命令的每一行输出。此数组中不包括尾部空白,如'n请注意,如果数组已经包含一些元素,exec()将附加到数组的末尾。如果不希望函数附加元素,请在将其传递给exec()之前,先对数组调用unset()

(强调矿)


因此,您的python程序被正确执行了两次。在第二个循环中,第一个命令的输出仍然存在于$output中,第二个命令的输出来附加到该循环中。

修复应该是:

unset($output);
exec("python /home/will/public_html/OrderAnalyser.py '$dataIn' '$originalName' 2>&1",$output);