我需要在数百个日志文件上运行一个 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 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,
注意:我从 this question 添加了 2>&1 位但这没有帮助;引用 Apache,但我在 CLI 上运行 PHP。
注意:
root:~# echo $PYTHONPATH
在 shell 中不产生任何输出。
我错过了什么?
最佳答案
python 默认缓冲输出。如果您的脚本提前终止(可能是由于 PHP 脚本超时),则不会刷新缓冲区。
调用set_time_limit()
来延长超时时间,设置环境变量PYTHONUNBUFFERED为非空字符串,或者用-u运行python。
关于php - 使用 system( ) 甚至 passthru( ) 从 php 运行 python 脚本不会产生任何输出。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17872839/