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を実行できるなら、わざわざそんな冗長なことしなくて良いですね。
よっしゃああああああああああああああああああああああ
設計書作るぞーーーーーーーー