php から、execコマンドを使って、pythonを実行し、pythonの実行結果を、phpで取得したい。
しかし、pythonの結果が返ってこない!
phpからexecコマンド
phpから、外部実行ファイルを呼び出す場合、
exec('/usr/bin/ls /tmp/',$ret_array);
と実行をすると、「$ret_array」の配列に、「/tmp/」以下のファイルが格納されます。
phpから、pythonを実行すると・・・
exec('/xxx/xxx/xxx.py 引数',$ret_array);
と指定すると、同じように、pythonの結果が、「$ret_array」に入るはずです。
しかし、入らない!(涙)
調べると、python から、標準出力した、「日本語」を取得できない!
試行錯誤:pythonの中で、utf-8で設定
import io,sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
と記述すると、うまくいくという記述があったが・・・
結果、うまくいかいない。
ターミナルウィンドウでは、上記の、utf-8の設定をしなくても、日本語が表示される。
しかしながら、PHPから、pythonを呼ぶ、CGIではうまくいかない。
import io,sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
の記述は、python 実行のCGIでは関係ないようである・・・
結論:exec実行時に、LANGの設定を
teratailに解決策があった・・・
exec('export LANG=ja_JP.UTF-8; /xxx/xxx/xxx.py 引数',$ret_array);
と、python実行前に、LANGの環境変数を指定しなければいけないようである。
これで、日本語が取得できました!
参考URL
teratail:PHPのshell_execでpythonを実行した時に、日本語が返ってこない
検証:nginx実行時の環境変数に・・・
nginx実行時のユーザの環境変数を設定すればいいのかと、
nginxのCGI実行ユーザの、.bash_profile
にて、
export LANG=ja_JP.UTF-8
と記述して、試してみます。
# su - (nginx実行ユーザ)
として、nginx実行ユーザになり・・・
(「-」をつけると、そのユーザの環境変数を読み込んでくれる)
$ export |grep LANG declare -x LANG="ja_JP.UTF-8"
とチェックすると、きちんと、UTF-8になっており、
「これで、python から、日本語が取得できるのか」
と思っていましたが・・・
実際に、CGIを実行しても、うまく表示されない(涙)
本番稼働のサーバーでは、セキュリティ対応として、nginx実行ユーザは、ログイン出来ないようにしていますので、この結果が、うまくいっても、.bash_profileに記述して、解決をすることはしないでしょう・・・
【世界で5万人が受講】実践 Python データサイエンス・オンライン講座