python

エックスサーバーでphpからexec関数でpythonを呼び出そうとして苦労した話

事象

エックスサーバー上でpythonプログラムを作成し、それをwebのPHPを経由でキックしようとしていた。

サーバーにSSHでログインして直接、pythonプログラムの起動する場合は問題なく結果が出力される。

phpのexecコマンドから同じように呼び出すとエラー、というか「import requests」のところで止まってしまい何も返ってこない。

結論

「python3」のコマンドを実行しようとしていたが、sshでログインして実行する場合と、web起動の場合では実行ユーザーが異なるため、見に行くpythonが変わってしまう。

「/home/XXX/bin/python3 test.py」のようにpythonをフルパスで指定して起動するとうまくいった。

解決までのログ

エラーログ出力

まずは、エラーメッセージが帰ってきていなかったので、エラーメッセージが出力されるように変更

//変更前
$command = "python3 test.py";
exec($command,$output);
print_r($output);

//変更後
$command = "python3 test.py 2>&1";
exec($command,$output);
print_r($output);

2>&1を付与することでエラーメッセージが表示された。

Array ( [0] => test [1] => Traceback (most recent call last): [2] => File "test.py", line 3, in [3] => import requests [4] => ModuleNotFoundError: No module named 'requests' )

どうやらrequestsモジュールのimportでエラーになっているらしい。

pythonのバージョンを確認

SSHコンソールと、phpでそれぞれ「which python3」を実行してどのpythonを見に行っているのかを調べる。

SSHコンソール:~/.linuxbrew/bin/python3
php:/usr/bin/python3 

見に行っているpythonが違うことが分かったので、「結論」のようにフルパス指定で起動したところうまく結果出力された。

ABOUT ME
hazukei
「はずけい」と申します。 この度一児の父となりました。まだ実感はわかないのですが、猛烈に忙しくなりそうです。楽しみつつ頑張りたいと思います!