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


Running a python script from php with system( ) or even passthru( ) produces no output. Why?

我需要在数百个日志文件上运行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中的输出(在"运行"之后),这是我的输出,没有问题,所以我知道PHP脚本没有语法问题。

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

我看到了很多关于exec()、system()和passthrough()的讨论,根据我所知,我应该使用system()看到输出,但出于某种原因,我没有。

我甚至试过

root:~# ps aux | grep php 

然后

root:~# strace -p <process_id> 

PHP脚本,但我得到的只是

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

注意:我添加了2>&这个问题有1点,但没有帮助;它引用了Apache,但是我在CLI上运行PHP。

注:

root:~# echo $PYTHONPATH

在shell中不产生任何输出。

我错过了什么?

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

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