Contents
事象
エックスサーバー上で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が違うことが分かったので、「結論」のようにフルパス指定で起動したところうまく結果出力された。