2015-01-12 186 views
-4

所以我对Python非常新,我熟悉Java,C和Ruby。Python SyntaxError:无效的语法elif语句

我试着编译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])) 

我没有写这一点,但我想运行它,我不断收到一个语法错误:无效的语法下的elif(的argv [1] ==“块”):

我假定这与不正确的缩进有关,如果任何人都可以这样做,让我知道我做错了什么,为什么这会很好!

+1

通常,Python中的if语句中不需要括号(虽然它们是允许的,因此它们不是你的错误)。 – Evert

+0

你的确应该缩进'x.seek和x.write'这两行,就像'x = open ...'缩进一样。 – fredtantini

+0

请先[请阅读教程](https://docs.python.org/3/tutorial/introduction.html#first-steps-towards-programming)。它说,除其他外:“循环的主体是缩进的:缩进是Python对语句进行分组的方式。” – Evert

回答

2

Python中的缩进问题。您的if区块与elif区块之间有缩进的行。这些将导致SyntaxError,因为您实际上得到了elif而没有if块。

无论缩进线,因此他们的if块匹配,或者使用第二if语句,而不是elif。看看你的代码,我想你会想缩进它们,否则你会得到NameErrors。在这种情况下,它变成:根据你的算法 -

对于例如在你的代码

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

这样,如果'argv [1] ==“unblock”,它会尝试写入'x'两次。缩进不匹配有点讽刺意味。 – Evert

+0

@Evert是真的讽刺:P感谢评论,编辑。 – Ffisegydd

0

压痕问题,改变

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

下面是该脚本的稍微更清晰的版本。

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