2016-08-12 4 views
-2

再割り当て、変数、テストを割り当てます。 (申し訳ありませんイライラ)Pythonはない場合の髪の毛を抜く変数

OK

ので、私はあればやろうとしている:Pythonで他には、唯一の私は、誰かが助けることができることを願っていますので、それが正常に動作させることはできません。私はできるだけ具体的にしようとします。

私は何をしなければならないのですか?> 何かが真であるかどうかを確認する変数を割り当てていますが、時にはそうでないこともあります。

その変数が真であるならば、私はそれがelseステートメントをスキップして、結果をプリントアウトしたいです。 (一度完全ではなく、印刷のスクリプトにresutlt戻ります実装)

のpythonコード:私はこのようにそれを実行したときに

import re 

os_version = open('/etc/os-release') 
for line in os_version: 
    OS = re.search(r'\AID_LIKE=\D[A-Za-z]+', line) 
    if OS: 
     print(str(OS.group()).lstrip('ID_LIKE="')) 
    else: 
     OS = re.search(r'\AID=\D[A-Za-z]+', line) 
     print(str(OS.group()).lstrip('ID="')) 

は私が持っている場合はNoneTypeのオブジェクトがグループ

を持っていません取得OS:文がelseの下でインデントされている場合は、printの前に両方の結果を返します。

私が実行しているLinuxのプラットフォームによって異なります結果がどうなるべきかについて

例(bashのコード)

#!/bin/bash 

VAR0=`cat /etc/os-release | grep -w ID_LIKE | cut -f2 -d= |\ 
    tr -d [=\"=] | cut -f1 -d' '` 
VAR0="${VAR0:=`cat /etc/os-release | grep -w ID | cut -f2 -d= |\ 
    tr -d [=\"=]`}" 
echo $VAR0 

if [ "$VAR0" = 'debian' ]; then 
    echo 'DEBIAN based' 
elif [ "$VAR0" = 'rhel' ]; then 
    echo 'RHEL based' 
elif [ "$VAR0" = 'suse' ]; then 
    echo 'SUSE based' 
else echo 'OTHER based' 

fi 

これにより、異なるOS->

bash -o xtrace test_2.sh 
++ tr -d '[="=]' 
++ cut -f1 '-d ' 
++ cut -f2 -d= 
++ grep -w ID_LIKE 
++ cat /etc/os-release 
+ VAR0= 
++ tr -d '[="=]' 
++ grep -w ID 
++ cut -f2 -d= 
++ cat /etc/os-release 
+ VAR0=debian 
+ echo debian 
debian 
+ '[' debian = debian ']' 
+ echo 'DEBIAN based' 
DEBIAN based 

からbashのコード - >

bash -o xtrace os-version.sh 
++ cat /etc/os-release 
++ grep -w ID_LIKE 
++ cut -f2 -d= 
++ tr -d '[="=]' 
++ cut -f1 '-d ' 
+ VAR0=rhel 
+ VAR0=rhel 
+ echo rhel 
rhel 
+ '[' rhel = debian ']' 
+ '[' rhel = rhel ']' 
+ echo 'RHEL based' 
RHEL based 

などから戻ってくる戻りあります最初の実行でVAR0が空であることがわかり、2番目の実行に移動します。私は、Pythonで何をしようとしているのです

誰かが助けることができますか?私はずっと画面で始まった後、何か単純なものを見落としていると感じています。

おかげ

EMジョエルのため

編集:

私の今のコードと結果=> コード:Debianシステム=>

から

#!/usr/bin/python3 

import re 

os_version = open('/etc/os-release') 
for line in os_version: 
    OS = re.search(r'\AID_LIKE=\D[A-Za-z]+', line) 
    if OS: 
     print(str(OS.group()).lstrip('ID_LIKE="')) 
     break 
    else: 
     OS = re.search(r'\AID=\D[A-Za-z]+', line) 
      if OS: 
      print(str(OS.group()).lstrip('ID="')) 

結果

python test.os-version_2.py 
debian 
openSUSEのlinuxmintから=>

python test.os-version_2.py 
opensuse 
suse 

結果(から

python test.os-version_2.py 
centos 
rhel 

結果は、私が何を実行しているcentos7 =から=>

python test.os-version_2.py 
raspbian 
debian 

結果>のDebianベースのシステムからの

結果今はubuntu/debian basiedだが)=>

python test.os-version_2.py 
linuxmint 

いくつかのものが異なった反応をしているので、カップルに基づいていろいろなディストリビューションがあるので、できるだけ結果を絞るつもりです。

それぞれは、さまざまなやり方をしています。できるだけベストプラクティスのスクリプトを試してみるために、私は物事を絞り込むつもりです。

「/ etc/os-release」の場合は、別のOSの表示方法が異なって表示されます。

編集答え:

これは私がprint文に変数を入れて、それが働いている変数を印刷するためにまだある理由を私は知りません。多分誰かが私のためにそれに答えることができます。

答えコード:

#!/usr/bin/python3 

import re 

os_version = open('/etc/os-release') 
for line in os_version: 
    OS = re.search(r'\AID_LIKE=\D[A-Za-z]+', line)#.group() 
    if OS is not None: 
     base_distro = (str(OS.group()).lstrip('ID_LIKE="')) 
    else: 
     OS = re.search(r'\AID=\D[A-Za-z]+', line)#.group() 
     if OS is not None: 
      base_distro = (str(OS.group()).lstrip('ID="')) 

print(base_distro) 

あなたはスクリプトにこれを入れた後、あなたは私が探しているものを見るだろう、それを実行した場合。システムプラットフォームを取得

+0

私はこれを幾分新しく書いておきます。プログラミングをかなりうまく読むことができますが、私の脳に書き込むことはできません。 – emetib

+1

エラーが発生している行を明確にすることはできますか?あなたのOS変数が予期せずNoneに設定されていることや、あなたの "print"インデントがオフであることはほぼ確実です。 –

+2

あなたはLinuxのディストリビューション名を取得しようとしていますので、この質問をチェックしてくださいhttp://stackoverflow.com/q/2756737/1040495 – user1040495

答えて

1

を支援するための

おかげでみんなは、Python 2.7でplatform import

import platform 

print platform.dist()[0],type(platform.dist()[0]) 

戻って私のプラットフォームで

debian <type 'str'> 

を参照してください簡単です。明確にするため

- OS = re.search(r'\AID_LIKE=\D[A-Za-z]+', line)

注 "インポート・プラットフォームは" 減価償却されるオブジェクト(NoneType)を返します。以下は新しい方法のメソッドです(基本的な方法はすべての状況に適していないかもしれませんが、あなたが記述したと思うもののために働きます)、コメントのようにdictを使用してください。

編集 - スーパー簡単な方法 - サブプロセスを使用したプラットフォームが

import subprocess 

output = subprocess.check_output(["cat", "etc/os-release"]) 
with open('text.txt', 'w+') as fd: 
    fd.write(output) 
with open('text.txt', 'r') as text_output: 
    for os_version in text_output: 
     try: 
      print os_version.split("ID_LIKE=",1)[1] 
     except: 
      continue 

を動作しない場合はここで私たちはラインを継ぎ、文字列として出力を取り、それをファイルにチャック実際のコマンドを呼び出して、すべての行を読みます私たちが望むキーワードで、OS IDを入力したいのですか?その後、追加してください。print os_version.split("ID=",1)[1]

ここでも出力はですdebian ラズベリーパイ

+0

それをcentos、opensuseディストロで試してみてください。私がしようとしているのは、ベースOSがどんなものなのかを絞り込むことです。つまり、debian、red hat、suse、その他かもしれません。 – emetib

+0

'platform.uname()[1]'を追加するとOSが返されます - ケースraspberrypi – itza

+0

centos7 = >>>>インポートプラットフォーム >>> print platform.dist()[0]、type(platform.dist ()[0]) ファイル ""、ライン1 印刷platform.dist()[0]、タイプ(platform.dist()[0]) ^ にSyntaxError:i「は何に拡大する無効な構文 – emetib

関連する問題