python赋值变量,test,如果为true则跳过else,如果没有重新赋值变量

时间:2016-08-12 03:34:27

标签: python

拉出头发。 (对不起沮丧)

好吧,所以我试图在if:中使用if:else,但是我无法让它正常工作,所以我希望有人可以提供帮助。我会尝试尽可能具体。

我要做的事情 - > 我指定一个变量来检查某些事情是否属实,有时它有时候不是。

如果该变量为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对象没有组

如果我在打印之前在else下缩进了if OS:语句,那么我得到两个结果,即使我有一个' break'第一次印刷后

取决于我运行的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

这是从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

来自不同的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

你可以看到第一次运行的VAR0为空,然后转到第二次。

这是我尝试用python做的事情。

有人可以帮忙吗?我有一种感觉,我只是在屏幕上开始这么长时间之后忽略了一些简单的东西。

感谢

EM

编辑joel:

我的代码现在和结果=> 代码:

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

来自基于debian的系统=>

python test.os-version_2.py 
raspbian
debian

来自centos7 =>

的结果
python test.os-version_2.py 
centos
rhel

来自opensuse =>

的结果
python test.os-version_2.py 
opensuse
suse

来自linuxmint的结果(我现在正在运行,即使它是基于ubuntu / debian的基础)=>

python test.os-version_2.py 
linuxmint

因此,由于某些事情的反应不同,并且有很多不同的发行版基于一对夫妇,我试图将结果缩小到尽可能少。

每个人都有不同的方式来做事,并试图让跨平台的脚本尽可能地工作,我试图缩小范围。

如果你是cat / etc / os-release'你会看到不同的操作系统以不同的方式显示它们。

编辑答案:

我不知道为什么现在还有一个变量用于打印语句,然后打印它正在工作的变量。也许有人可以为我解答。

回答代码:

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

如果您将其放入脚本中然后运行它,您将看到我正在寻找的内容。

感谢大家的帮助

1 个答案:

答案 0 :(得分: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 < / p>

编辑 - 超级简单的方法 - 如果平台不起作用,则使用子流程

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

这里我们只调用实际命令,将输出作为字符串,将其放入文件中,然后读取所有行,将行拼接在我们想要的关键词和bam!想要操作系统ID吗?然后添加print os_version.split("ID=",1)[1]

再次输出是: Debian的 树莓派