自分は普段はPHP使いなので、Webの画面なんかは基本的に全てPHPで書いている。
ただ、ある件で計算処理をPythonで書いた。
OSはCentOS7なのでデフォルトで入っているPythonは「2」だが、今更2もないだろ、てなもんで「3」をpyenv + anaconda で python3.6.4 をインストールしてある。
このPythonプログラムは基本的にはcronで定期実行されるのだが、PHPの画面側からキックする必要があった。
どうするか悩んだ挙句、
- PHPからShellスクリプトをキック
※exec() 文で - Shellスクリプト内で環境変数を読み込んでpython3を使用して当該のPythonプログラムを実行
そこでいろいろ実験していたが、環境変数の読み込みで 上手くいかないなー と試行錯誤していた際、取り敢えず単純な「python --version」を実行してみよう(計算は時間かかるし)と思ったが、一向にバージョンが返ってこねぇぇ!
と思って、ふと思い出した。
PHPの exec() の実行結果(第2引数に入る)は標準出力しか返さないのだった。
まさか...モノは試しだ。
いくつか試してみた。
PHP → 標準出力
# 出力のうち 標準出力 を捨ててみる → 表示なし → 出力は標準出力
~% php -v 1> /dev/null
# 出力のうち 標準エラー出力 を捨ててみる → 表示される → 出力は標準エラー出力じゃない
~% php -v 2> /dev/null
PHP 7.2.5 (cli) (built: May 23 2018 14:08:33) ( NTS )
【略】
Ruby → 標準出力
~% ruby -v 1> /dev/null
→ 出力なし
~% ruby -v 2> /dev/null
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
一応 httpd → 標準出力
# httpd -v 1> /dev/null
→ 出力なし
# httpd -v 2> /dev/null
Server version: Apache/2.4.6 (CentOS)
【略】
そして python → 標準エラー出力
~% python --version 1> /dev/null
Python 3.6.4 :: Anaconda, Inc.
~% python --version 2> /dev/null
→ え、こっちが出力なし???
バージョン表示が 標準エラー出力 ならば、標準出力しか拾ってくれない exec() 関数で表示されるわけがありません。
Pythonのバージョンの出力が標準エラー出力なのは、何か深遠な理由でもあるのでしょうか...
たったこれだけのことで1時間もロスしてしまったorz
ただ以下の Qiita の記事によると、通常の Python3 は標準出力らしい。何故だ―