2015-01-12 219 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()