使用system()甚至passthru()从php运行python脚本不会产生任何输出。为什么?

时间:2013-07-26 04:21:03

标签: php python exec system passthru

我需要在数百个日志文件上运行python脚本(日志解析器),但我是一个PHP人员,所以我想我会编写一个小PHP脚本来从目录中获取文件列表并调用在foreach循环中动态地运行python脚本。

我在PHP脚本中使用python二进制文件的完整系统路径设置变量,这是python脚本的完整路径,并检查一切看起来是否正确。我回应了我试图运行的脚本输出来检查它:

<?php
// batch.php (modified for SO post)
$python = '/usr/bin/python';
$script = '/mnt/data/scripts/the/python/script.py';
// $folder contains the full system path to the dir containing
// the files I need to pass as args to script.py
$files = scandir($folder);
foreach($files as $file){
    if($file=='..'||$file=='.')
    {
        continue;
    }
    $system = $python.' '.$script.' '.$folder.$file.' 2>&1';
    echo "Running ". $system ."\n";
   // I also tried passthru( )
   system($system);
}

接下来我做

php batch.php

我得到的只是PHP的第一行:

Running /usr/bin/python /mnt/data/scripts/the/python/script.py /path/to/data/file/one.log

我可以直接使用python复制,粘贴和运行在shell中回显的输出(在'Running'之后),这是我的输出,没问题,所以我知道PHP脚本没有语法问题。

但是当运行php脚本包装它时,它不会产生除PHP的echo()语句之外的输出。它只是挂在那里(我认为我长期运行的Python脚本实际上正在工作,但我不知道该怎么说。)错误日志中没有任何内容,脚本永远不会退出,直到我按Ctrl-C。

我已经看过很多关于exec(),system()和passthru()的讨论,从我可以告诉我应该看到使用system()的输出,但由于某种原因,我不是。

我甚至试图

root:~# ps aux | grep php 

然后

root:~# strace -p <process_id> 
PHP脚本的

,但我得到的只是

root:~# strace -p 14232
Process 14232 attached - interrupt to quit
read(4, 

注意:我在this question添加了2&gt;&amp; 1位但没有帮助;引用Apache然而我在CLI上运行PHP。

注意:

root:~# echo $PYTHONPATH
shell中的

不产生输出。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

默认情况下,python缓冲输出。如果您的脚本过早终止(可能由于PHP脚本超时),则不会刷新缓冲区。

调用set_time_limit()以延长超时,并将环境变量PYTHONUNBUFFERED设置为非空字符串,或使用-u运行python。