数百のログ ファイルに対して 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 は出力を生成しません。
私は何が欠けていますか?