はじめに
タイトルからわかるようにニッチすぎる要求ですが、途中いろいろエラーにひっかかったので半ば自分用にまとめています。
python関数をPHPで実行する
コマンド実行関数
python関数にかぎらず、PHPでコマンドライン上と同じようにコマンドを実行するには、execコマンドが使えます。(参照 https://www.php.net/manual/ja/function.exec.php)
exec($command, $output, $result_code);
$command に実行したいコマンドを渡します。
$outputと$result_codeはオプションですが、$outputはコマンド実行結果を配列で格納、$result_codeは、コマンド実行に成功したかどうかを表すコードが格納されます。
例えば、
exec('ls', $output, $result_code);
を実行すると、カレントディレクトリ内のファイルやディレクトリを表示するコマンド"ls"が実行され、その結果が$outputに格納されます。
成功した時の$result_codeは0になるようです。(※要確認)
python実行コマンド(引数渡し)
以下のようなpythonファイルhello.pyを考えます。
def hello(name):
print(name)
引数を受け取ってprintするだけです。
これをコマンドラインから実行するには以下のようにします。
# python -c 'import hello; hello.hello("Alice")'
このコマンドを$commandとして、先述のexecコマンド引数としてあげると、PHPからpython関数を実行することができます。
ただし、この方法で関数を実効するには、hello.pyと同じディレクトリでコマンドを実行する必要があります。
別ディレクトリから実行できるようにする
pythonには詳しくないので行き当たりばったりでうまくいった方法が以下です。
- $PYTHONPATHの利用
python実行時に参照するPATHという認識。
# export PYTHONPATH=<指定したいパス>:${PATH}
とすることで、指定したいパスを参照するようになります。
今回はhello.pyを含むディレクトリを指定するとよいです。
このようにすると、hello.pyを含まない別のディレクトリからでも python -c コマンドでhello関数を実行できます。
Webサーバ上で実行する
PHPを使っている時点でWebサーバを運用していることが多いと思います。
単純にサーバ上のコマンドラインから上記のような方法で実行するのと、Webサーバ上から同じコマンドを実行するのとでは違いがあります。
(参照 https://sierra-kilo.hatenablog.jp/entry/2017/08/11/233708)
$PYTHONPATHで指定していたパスは、Webサーバから実行する際に引き継がれないようです。
参照記事では、apacheの設定ファイルを書き換えて対処していますが、今回は/etc/sysconfig/httpdで設定を変更します。
(参照 http://yukke.blog3.fc2.com/blog-entry-68.html)
こちらの参照記事では
export ORACLE_HOME=/oracle/home/
とすることで、環境変数ORACLE_HOMEを追加していますが、今回追加したい環境変数はPYTHONPATHです。
また、なぜかexportではうまくいかなかったので以下のようにしました。
PYTHONPATH=<指定したいパス>:${PATH}
ここまで書き換えたらapacheを再起動して確認します。
環境変数の確認にはphp.info()が便利です。(使い方の詳細は割愛します)
環境変数にPYTHONPATHが追加されていたら、Webサーバから指定パスを参照することができるようになるので、python関数を実行することができるようになると思います。
まとめ
今回は、1つの目的のためにいくつかひっかかった点があったのでいっぺんにまとめましたが、それぞれ独立してまた使えるものだったと思います。
簡潔にまとめると
- exec関数の使い方
- python -c コマンドの使い方
- PYTHONPATHを指定して別ディレクトリから実行
- Webサーバから実行する際の環境変数を追加する
でした。
日々勉強ですね。