我需要在数百个日志文件上运行 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 中不产生任何输出。
我错过了什么?