2016-05-10 1 views
3

私は以下のコードを作成しています。Pythonを使っているpythonのバージョンを得ることができません - Linuxでpopenを使ってPythonを使用するバージョン

#!/usr/bin/python 

import subprocess 
import os 

cmd = 'python --version' 
stdout = subprocess.Popen(cmd, shell = True, stdout = subprocess.PIPE).stdout 
ver = stdout.read() 

このコードは単純にコンソールにpythonバージョンを表示していて、変数verに値が設定されていません。 誰も私はなぜこれが動作していないか理解するのを助けることができますか?

私はノード上でプロセスが実行されているかどうかを確認しています。

cmd = 'ps -ef | grep cmserver | grep -v grep' 
stdout = subprocess.Popen(cmd, shell = True, stdout = subprocess.PIPE).stdout 
cmserver = stdout.read() 

そしてここで、何が画面に印刷されていないと、変数cmserverは、必要な値を持っています。

+3

への短い答えであるかもしれませんか? –

+0

いいえ、私はこの行動の違いを理解したいと思っています。私はそのようなことが起こっているのを見て驚いた。私はsys.version_infoで大丈夫ですが、私の目的に役立ちます。しかし、それは好奇心を満たすことができません:) – Gauranga

答えて

5

これはPythonがstdoutではなくstderrにバージョン文字列を出力するからです。だから、修正はマイナーです:

process = subprocess.Popen(cmd, shell = True, 
          stdout = subprocess.PIPE, 
          stderr = subprocess.PIPE) 
version = process.stderr.read() 

しかし、この解決法は、一種のクルージングです。彼/彼女が言及したように、より直接的なバージョンを得るためのより直接的なPython言語の仕組みでしょう。

+0

しかし、なぜstderrに? – Gauranga

+1

@Gaurangaこれは標準的なものであり、Pythonの実行可能ファイルに特有のものではありません。多くの出力を生成すると予想されるプログラムでは、そのようなメタデータを別のストリームに分離するのに役立ちます。とにかくそれは私がいつもそれを理解してきた方法です。そこに正式に文書化された理由があるかもしれません。 gccも同じことをします。 – Jameson

4

それは働いていない理由を私は知らないが、あなたはちょうどそれがタプルだあなたができるだけで

import sys 
print(sys.version_info) 

Pythonのバージョンが必要な場合は、インデックスによって異なる要素にアクセスすることができます。

編集:それは実際にsys.version_info.majorも書くことができる名前付きタプルです。

0
cmd = 'python --version 2>&1' 

は、あなたが `sys.version_info`に不満があるあなたの問題

関連する問題