【发布时间】:2016-08-14 09:06:01
【问题描述】:
拔头发。 (抱歉受挫)
好的,所以我正在尝试在 python 中做一个 if: else ,只是我无法让它正常工作,所以我希望有人能提供帮助。我会尽量做到具体。
我想做的事-> 我正在分配一个变量来检查某事是否正确,有时它有时不是。
如果该变量为真,那么我希望它跳过 else 语句并打印出结果。 (一旦完全实现,它将返回结果到脚本而不是打印)
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 对象没有组
如果我有一个 if OS: 语句在打印之前在 else 下缩进,那么我会返回两个结果,即使我在第一次打印后有一个“中断”
取决于我运行的 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
来自不同的操作系统->
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
为乔尔编辑:
我现在的代码和结果=> 代码:
#!/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)
如果你把它放到一个脚本中然后运行它你会看到我在找什么。
感谢大家的帮助
【问题讨论】:
-
我应该补充一点,我对这些东西有些陌生。可以很好地阅读编程,但无法让我的大脑编写它。
-
你能澄清哪一行给出了错误吗?几乎可以肯定,您的操作系统变量意外设置为无,和/或您的“打印”缩进已关闭。
-
您正在尝试获取 linux 发行版名称,请查看此问题 stackoverflow.com/q/2756737/1040495
-
Jjpx,我看了看,它有点走上正轨。但正如评论者所说,这是贬值的。没有运行它,因为我试图让它在 3.x 下运行
-
你假设系统有一个
/etc/os-release文件。并非所有 Linux 系统都可以。
标签: python