「広告」

PHPから、pythonを呼び出した時、返値を取得できない。

「広告」
記事内に広告が含まれています。
「広告」

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 データサイエンス・オンライン講座

タイトルとURLをコピーしました