「python --version」の出力先が標準エラー出力な件

自分は普段はPHP使いなので、Webの画面なんかは基本的に全てPHPで書いている。

ただ、ある件で計算処理をPythonで書いた。

OSはCentOS7なのでデフォルトで入っているPythonは「2」だが、今更2もないだろ、てなもんで「3」をpyenv + anaconda で python3.6.4 をインストールしてある。

このPythonプログラムは基本的にはcronで定期実行されるのだが、PHPの画面側からキックする必要があった。

どうするか悩んだ挙句、

  1. PHPからShellスクリプトをキック
    ※exec() 文で
  2. 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 は標準出力らしい。何故だ―

【Python】--versionの出力先が2系と3系で違う問題

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は 必須項目です。

管理者が承認次第、表示されます。

*