2

数百のログ ファイルに対して Python スクリプト (ログ パーサー) を実行する必要がありますが、私は PHP の専門家なので、ディレクトリからファイルのリストを取得して Python スクリプトを呼び出す小さな PHP スクリプトを作成することにしました。 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で直接コピー、貼り付け、実行できます。出力は問題ありません。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

in shell は出力を生成しません。

私は何が欠けていますか?

4

1 に答える 1