【问题标题】:python assign variable, test, if true skip else, if not re-assign variablepython分配变量,测试,如果为真跳过否则,如果不是重新分配变量
【发布时间】: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


【解决方案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)

注意“进口平台”会折旧。以下是采用新方法的方法(只是一种基本方法,可能并不适合所有情况,但它适用于我认为您所描述的内容 - 进行比较,只需使用 cmets 中的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

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

同样的输出是: Debian 树莓派

【讨论】:

  • 在 centos、opensuse 发行版上试试。我要做的是缩小基本操作系统的范围,即 debian、red hat、suse 等。
  • 添加 platform.uname()[1] 将返回操作系统 - 对于我的情况是 raspberrypi
  • 在 centos7=>>>> 导入平台 >>> 打印 platform.dist()[0],type(platform.dist()[0]) 文件“”,第 1 行打印 platform.dist()[0],type(platform.dist()[0]) ^ SyntaxError: invalid syntax
  • 扩展我正在尝试做的事情:如果我想根据您正在运行的命名发行版说在哪里寻找东西,那么我不得不说->如果是 debian,那么,elif/or raspberry, elif/or ubuntu, elif/or linuxmint, elif/or rhel, elif/or centos, elif/or fedora, elif/or..... 如果我能把它缩小到三巨头马上,那不是那么容易吗?
  • @ementib 根据精确匹配一组字符串中的一个来决定做什么是完全 dict 解决的问题类型:os_map = {'debian': deb_func, 'rhel': rh_func, 'fedora': rh_func, ...} 然后,只需 @ 987654331@.
猜你喜欢
  • 2021-10-06
  • 2013-05-10
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多