2016-08-12 62 views
-2

拉出頭髮。 (對不起沮喪)python分配變量,測試,如果真的跳過else,如果不是重新分配變量

好的,所以我想要做一個if:else在Python中,只有我不能讓它正常工作,所以我希望有人可以幫助。我會嘗試儘可能具體。

我正在做什麼 - > 我正在分配一個變量來檢查是否爲真,有時候它不是。

如果該變量爲true,那麼我希望它跳過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對象沒有組

,如果我有一個如果操作系統:語句縮小在其他打印之前,然後我得到兩個結果回來,即使我在第一次打印後有'休息'

取決於我運行的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是空的,然後轉到第二次。

這就是我想要做的與python。

有人可以幫忙嗎?我有一種感覺,我只是在屏幕上開始很長時間後忽略了一些簡單的東西。

感謝

EM

編輯喬爾:

現在我的代碼,結果=> 代碼:

#!/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="')) 

結果從Debian系統=>

python test.os-version_2.py 
debian 
從=>

python test.os-version_2.py 
raspbian 
debian 

從centos7 =結果>從openSUSE的=>

python test.os-version_2.py 
opensuse 
suse 

結果從linuxmint(

python test.os-version_2.py 
centos 
rhel 

結果就是我運行一個基於Debian的系統個

結果現在,即使它是ubuntu/debian basied)=>

python test.os-version_2.py 
linuxmint 

因此,因爲有些事情的反應不同,有很多不同的發行版基於一對夫婦,我試圖儘可能減少結果的範圍。

每個人都有不同的方式,他們做事情,並試圖獲得跨平臺的腳本儘可能最好的腳本,我試圖縮小範圍。

如果你的'cat/etc/os-release'你會看到不同的os顯示的東西不同。

編輯答案:

我不知道爲什麼,這又是我把一個變量來打印報表,然後打印它的工作變量。也許有人可以爲我回答。

答案代碼:

#!/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

你能否澄清哪條線給出錯誤?幾乎可以肯定的是,你的操作系統變量意外地被設置爲None,並且/或者你的「打印」縮進關閉了。 –

+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 

在這裏,我們只需要調用實際的命令,把輸出作爲一個字符串,在一個文件不幹了,並閱讀所有的線,拼接線在關鍵字我們想要和巴姆!想要操作系統ID?然後添加print os_version.split("ID=",1)[1]

再次輸出是: debian 覆盆子pi

+0

嘗試在一個centos上,opensuse發行版。我想要做的是縮小基本操作系統的內容,例如debian,red hat,suse,其他可能。 – emetib

+0

添加'platform.uname()[1]'將返回操作系統 - 對於我的情況raspberrypi – itza

+0

on centos7 = >>>>導入平臺 >>> print platform.dist()[0],type(platform.dist ()[0]) 文件「」,第1行 print platform.dist()[0],type(platform.dist()[0]) ^ SyntaxError:invalid syntax – emetib