Laravelで作成するアプリケーションで、一部の言語に関する処理のところをPython(自然言語処理)で実行したい。
方法としては、1.PHP組み込み関数のexec関数を使用する、2.symfony/processライブラリを使う の2通りがあるようだ。
今回は「exec関数」を使用する。python実行のテストのみなので、以下簡略化して記述している。
### exec関数とは?
exec関数はPHPの組み込み関数で、外部プログラムを実行できる
### Laravelプロジェクトインストール
$ composer create-project –prefer-dist laravel/laravel laravel-python
$ cd laravel-python
$ composer require laravel/jetstream
$ php artisan jetstream:install livewire
$ npm install && npm run dev
$ php artisan migrate
$ php artisan serve –host 192.168.33.10 –port 8000
### Routing
web.php
L index.bladeからpostした際に、ExecControllerのexecutePython() メソッドでpythonを実行する
use App\Http\Controllers\ExecController;
use App\Http\Controllers\TestController;
Route::post('/python', [ExecController::class, 'executePython']);
Route::get('/test', [TestController::class, 'index']);
### View
index.blade.php
L フォームのactionから、ExecController@executePythonにpostする
<h1>Test</h1>
<form action="python" method="post">
@csrf
<input type="submit" name="submit">
</form>
### Controller
ExecController.php
L exec($command, $output);で実行する。
L $commandは、「python3 ${絶対パス}.py」で実行する
L laravelでは、app_path()でappディレクトリのpathを取得するので、app_path()とする
L execの第二引数である$outputは、コマンドで*.pyを実行した際の出力が返ってくる。
class ExecController extends Controller
{
//
public function executePython(Request $request){
$path = app_path() . "/Python/app.py";
$command = "python3 " . $path;
exec($command, $output);
dd($output);
// return view('index', compact('output'));
}
}
※テストなのでdd($output)で出力を確認します。
laravel-python/app/Python/app.py
※今回はlaravelプロジェクトのapp/Python/配下にapp.pyを作成した。絶対パスなので、どこれも良いっぽいが、appフォルダに作るのが一般的のよう。今回はテストなので単にprint()するだけにした
print("hello")
### Laravelでpythonを実行した実行結果
bladeで「送信」ボタンを押すと、pythonで*.pyを実行する
実行後
L 配列で返ってくる
返ってきた変数(値)は、viewに再度返却できますね。
うおおおおおおおおおおおおおおおおおおおおおおおおお
やべえええええええええええええええええ
やりたいこと(自然言語処理)の9割くらいはイメージできた!!!!!!!!!!!!!
当初、Pythonの処理(nlpなど)の部分は、サブドメインを取得して別サーバを立ててDjangoで実装しようかと思ってたが、Laravelでpythonを実行できるなら、わざわざそんな冗長なことしなくて良いですね。
よっしゃああああああああああああああああああああああ
設計書作るぞーーーーーーーー