Python SyntaxError:无效语法elif语句

Python SyntaxError:无效语法elif语句,python,syntax-error,Python,Syntax Error,因此,我对python非常陌生,我熟悉Java、C和Ruby 我尝试为Kali编译一个脚本来修复wifi设备的RFkill问题,因为Kali没有RFkill #!/usr/bin/python # replacement for rfkill util, which is missing in kali # By: Geist from sys import argv if(argv[1] == "unblock"): x = open("/sys/class/rfkill/rfki

因此,我对python非常陌生,我熟悉Java、C和Ruby

我尝试为Kali编译一个脚本来修复wifi设备的RFkill问题,因为Kali没有RFkill

#!/usr/bin/python
# replacement for rfkill util, which is missing in kali
# By: Geist

from sys import argv

if(argv[1] == "unblock"):
    x = open("/sys/class/rfkill/rfkill%s/soft" % argv[2], "w")
x.seek(0)
x.write('0')

elif(argv[1] == "block"):
    x = open("/sys/class/rfkill/rfkill%s/soft" % argv[2], "w")
x.seek(0)
x.write('1')


print("interface %s %sed" % (argv[2], argv[1]))
我没有写这篇文章,但我正在尝试运行它,我不断得到一个SyntaxError:elifargv[1]==block下的无效语法:

我假设这与不正确的缩进有关,如果有人能让我知道我做错了什么,为什么那会很好

缩进在Python中很重要。在if块和elif块之间有未缩进的线。这些将导致语法错误,因为您实际上得到了一个没有if块的elif块

可以缩进行以便与if块匹配,或者使用第二个if语句而不是elif语句。看看你的代码,我想你会想缩进它们,否则你会得到名称错误。在这种情况下,它变成:

#!/usr/bin/python
# replacement for rfkill util, which is missing in kali
# By: Geist

from sys import argv

if(argv[1] == "unblock"):
    x = open("/sys/class/rfkill/rfkill%s/soft" % argv[2], "w")
    x.seek(0)
    x.write('0')

elif(argv[1] == "block"):
    x = open("/sys/class/rfkill/rfkill%s/soft" % argv[2], "w")
    x.seek(0)
    x.write('1')


print("interface %s %sed" % (argv[2], argv[1]))

缩进问题在您的代码中,根据您的算法进行更改-

例如

#!/usr/bin/python
# replacement for rfkill util, which is missing in kali
# By: Geist

from sys import argv

if(argv[1] == "unblock"):
    x = open("/sys/class/rfkill/rfkill%s/soft" % argv[2], "w")
    x.seek(0)
    x.write('0')
elif(argv[1] == "block"):
    x = open("/sys/class/rfkill/rfkill%s/soft" % argv[2], "w")
    x.seek(0)
    x.write('1')


print("interface %s %sed" % (argv[2], argv[1]))

这是该脚本的一个稍微简洁的版本

#! /usr/bin/env python

from sys import argv

def main():
    try:
        cmd = ("unblock", "block").index(argv[1])
    except ValueError:
        print("Bad command: %s" % argv[1])
        exit(1)

    fname = "/sys/class/rfkill/rfkill%s/soft" % argv[2]
    with open(fname, "w") as f:
        f.seek(0)
        f.write(str(cmd))

    print("Interface %s %sed" % (argv[2], argv[1]))


if __name__ == "__main__":
    main()

通常,Python中的if语句不需要括号,尽管它们是允许的,因此它们不是您的错误。。。是缩进的。请先做。其中包括:循环体是缩进的:缩进是Python对语句进行分组的方式。两个if分支之间唯一不同的是write函数。为什么不把两行重复的代码移到if语句之前,只把write函数放在if语句中?@Evert:编写代码当然是个好主意,但我想如果argv[1]既不阻塞也不解除阻塞,它当前的结构是确保不发生坏事情的基本方法。这样,如果`argv[1]==取消阻止,它将尝试写入x两次。缩进不匹配有点讽刺。@Evert是的,确实讽刺:P谢谢你的评论,编辑。