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

使用system()甚至passthru()从php运行python脚本不会产生任何输出。为什么?,php,python,exec,system,passthru,Php,Python,Exec,System,Passthru,我需要在数百个日志文件上运行python脚本(日志解析器),但我是一个PHP爱好者,所以我想我应该编写一个小PHP脚本,从目录中获取文件列表,并在foreach循环中动态调用python脚本 我已经使用python二进制文件的完整系统路径(python脚本的完整路径)在PHP脚本中设置了变量,并检查了所有内容是否正确。我回显我试图运行的脚本的输出,以检查它: <?php // batch.php (modified for SO post) $python = '/usr/bin/pyth

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

我已经使用python二进制文件的完整系统路径(python脚本的完整路径)在PHP脚本中设置了变量,并检查了所有内容是否正确。我回显我试图运行的脚本的输出,以检查它:

<?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的第一行:

Running /usr/bin/python /mnt/data/scripts/the/python/script.py /path/to/data/file/one.log
我可以直接用python复制、粘贴和运行shell中的输出(在“运行”之后),这是我的输出,没有问题,所以我知道PHP脚本没有语法问题

但是,当运行包装它的php脚本时,除了php中的echo()语句之外,它不会产生任何输出。它只是挂在那里(我认为我的长时间运行的Python脚本实际上正在工作,但我不知道如何判断。)错误日志中没有任何内容,并且在我按下Ctrl-C键之前,脚本永远不会退出

我已经看过很多关于exec()、system()和passthru()的讨论,从中我可以看出,我应该看到使用system()的输出,但由于某些原因,我没有看到

我甚至试着

root:~# ps aux | grep php 
然后

root:~# strace -p <process_id> 
注意:我从中添加了2>&1位,但没有帮助;这引用了Apache,但是我在CLI上运行PHP

注:

root:~# echo $PYTHONPATH
在shell中不产生任何输出


我缺少什么?

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


调用
set\u time\u limit()
以延长超时时间,并将环境变量pythonunbuffer设置为非空字符串,或者使用-u运行python。

代码看起来不错,也许python脚本根本没有输出任何东西?@hago,我在几个小时后检查了运行的脚本,它确实产生了输出——在运行脚本的最后——我没有看到正在进行的更新。我想python脚本在运行时对stdout做了一些魔术,这与普通的echo不同。我希望能够监控它,但至少我可以告诉它的工作。也许我会深入研究一下python脚本,看看它在工作时做了什么。非常好用!非常感谢您,一直在寻找解决方案。
root:~# strace -p 14232
Process 14232 attached - interrupt to quit
read(4, 
root:~# echo $PYTHONPATH