2010-08-23 70 views
0

作爲一個大型的Python程序,我有以下代碼的一部分:混亂蟒蛇問題

for arg in sys.argv: 
    if "name=" in arg: 
      name = arg[5:] 
      print(name) 
    elif "uname=" in arg: 
      uname = arg[6:] 
      print(uname) 
    elif "password=" in arg: 
      password = arg[9:] 
      print(password) 
    elif "bday=" in arg: 
      bday = arg[5:] 
      print(bday) 
    else: 
      pass 

程序期望的是這樣的:

python prog.py "name=Kevin" "uname=kevin" "password=something" "bday=01/01/01" 

當我嘗試後,使用「UNAME」程序失敗,聲稱「uname未定義」 我添加了「print()」行來嘗試和調試,並且「print(uname)」始終顯示「= kevin」,無論我放在哪裏的索引號(這裏是「6 :「)。其他陳述似乎工作正常。這是Python中的錯誤嗎?我很困擾。

在此先感謝。

+7

「這是Python中的錯誤嗎?」這個機率幾乎爲零。 – 2010-08-23 15:50:26

+4

正在使用'getopt','optparse'或'argparse'模塊之一嗎? – cji 2010-08-23 15:52:27

+1

Python附帶電池:http://docs.python.org/library/optparse.html#module-optparse(適用於Python2.6或更早版本)或http://docs.python.org/library/argparse.html #module-argparse(對於Python2.7或更高版本,或者如果你自己安裝它)。 – unutbu 2010-08-23 15:55:03

回答

11

elif「uname =」永遠不會運行,因爲字符串「name =」在「uname =」中。基本上,你正在覆蓋你的名字變量。

>>> "name=" in "uname=" 
True 

您可以重新排序您的ifs,以便uname出現在名稱之前。

+0

謝謝馬克!我沒有看到。哇。這解釋了很多。 – Violet 2010-08-23 15:53:41

+5

@ user428582,如果arg.startswith('whatever'):'儘快使用更強大的方式解析參數(例如optparse),那麼快速修復會更好...... – 2010-08-23 15:54:40

+3

只需打印當您爲多個變量進行調試時,變量對於調試並不是很有幫助。如果你完成了「打印」uname「,uname」,你會看到「= kevin」是錯誤的變量。 – unholysampler 2010-08-23 15:58:02

4

讓我們仔細看看這個。

if "name=" in arg: 
     name = arg[5:] 
     print(name) 
elif "uname=" in arg: 
     uname = arg[6:] 
     print(uname) 

當我將此應用於「name = Kevin」時,哪條規則有效?只是第一個,對吧?

當我將此應用於「uname = kevin」時,哪個規則有效?第一?第二個?都?有趣的是,第一個作品。我在uname=kevin內看到name=kevin。不是你想要的,是嗎?