我需要在数百个日志文件上运行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中不产生任何输出。
我错过了什么?
调用set_time_limit()
以延长超时时间,并将环境变量PYTHONUNBUFFERED设置为非空字符串,或者使用-u运行python。