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

标签 php python exec system passthru

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

相关文章:

php - Apache 配置 ssl

python - 如何在我的代码工作时跳出 for 和 try 循环?

PHP exec() 和路径中的空格

python - 可迭代预期的原始文本文档,接收到字符串对象

r - 查看 RStudio 正在使用的 'R' 路径的命令

php - 如何从另一个执行php脚本?

php - 使用SQL从mysql表中选择数据

PHP画廊问题

php - 如何在php中检查url是否存在

python请求获取网页失败