Skip to main content
 首页 » 编程设计

php之使用 system( ) 甚至 passthru( ) 从 php 运行 python 脚本不会产生任何输出。为什么

2025年05月04日23myhome

我需要在数百个日志文件上运行一个 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。