我需要在数百个日志文件上运行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中的不产生输出。
我错过了什么?
答案 0 :(得分:0)
默认情况下,python缓冲输出。如果您的脚本过早终止(可能由于PHP脚本超时),则不会刷新缓冲区。
调用set_time_limit()
以延长超时,并将环境变量PYTHONUNBUFFERED设置为非空字符串,或使用-u运行python。