2

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

我已经使用 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 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() 和 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, 

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

笔记:

root:~# echo $PYTHONPATH

在 shell 中不产生任何输出。

我错过了什么?

4

1 回答 1

1

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

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

于 2014-01-17T20:06:08.327 回答