2017-03-07 26 views
0

在Python 2.7.13Python的2.7.11的getopt不讀取參數

我們有以下Python代碼採取命令行參數:

import sys 
import csv 
import os 
import sys, getopt 
import pandas as pd 
print('Python version ' + sys.version) 
print('Pandas version ' + pd.__version__) 


def main(): 

    SERVER_NAME='' 

    PORT_NAME='' 

    PASSWORD='' 

    try: 

     opts, args = getopt.getopt(sys.argv[1:],"hs:p:x:",["server=","port=","password="]) 

    except getopt.GetoptError: 

     print 'help' 

     sys.exit(2) 

    for o, a in opts: 

     if o == '-h': 

      print '\n'+'-s/--server (required)' 

      print '\n'+'-p or --port (required)' 

      print '\n'+'-x or --password (required)' 

      sys.exit() 

     elif o in ("-s", "--server"): 

      SERVER_NAME = a 

     elif o in ("-p", "--port"): 

      PORT_NAME = a 

     elif o in ("-x", "--password"): 

      PASSWORD = a 

     else: 

      assert False, "No command line option. To see the options, plese use -h" 


if __name__ == "__main__": 

    main() 

print SERVER_NAME 

dbServer=SERVER_NAME 

但是,在運行上面的代碼時,在命令行:

python test.py -s AAA -p BBB -x CCC 

以下錯誤會顯示:

print SERVER_NAME 
NameError: name 'SERVER_NAME' is not defined 

如果這裏有什麼不對的話,任何大師都可以啓發嗎?謝謝。

回答

1

SERVER_NAME被定義爲一個局部變量的main()功能,對是不是在全球範圍內可見的(在你的代碼底部的線條。
你既可以使SERVER_NAME一個全局變量或之後移動代碼main()調用main(),我的偏好是後者;當我用這樣的CLI編寫代碼時,在調用main()後我沒有任何代碼(我通常在調用之前有全局設置代碼,但沒有一個取決於在main函數中發生了什麼)

這裏是我的意思是'將代碼移入主':

dbServer = '' 

def main(): 
    global dbServer 
    SERVER_NAME='' 
    PORT_NAME='' 
    PASSWORD='' 
    try: 
     opts, args = getopt.getopt(sys.argv[1:],"hs:p:x:", ["server=","port=","password="]) 
    except getopt.GetoptError: 
     print 'help' 
     sys.exit(2) 

    for o, a in opts: 
     if o == '-h': 
      print '\n'+'-s/--server (required)' 
      print '\n'+'-p or --port (required)' 
      print '\n'+'-x or --password (required)' 
      sys.exit() 
     elif o in ("-s", "--server"): 
      SERVER_NAME = a 
     elif o in ("-p", "--port"): 
      PORT_NAME = a 
     elif o in ("-x", "--password"): 
      PASSWORD = a 
     else: 
      assert False, "No command line option. To see the options, plese use -h" 

    print SERVER_NAME 
    dbServer=SERVER_NAME  

if __name__ == "__main__": 
    main() 
+0

對不起,我不太明白。因此,如果我將「if __name__ ==」__main__「: 」main()「移動到代碼的最底部(此後不再有代碼),它仍會返回」NameError:name'SERVER_NAME'未定義「。你能開導嗎? – Chubaka

+0

謝謝你的啓發!現在我明白了。另一個問題:全局dbServer =>將dbServer設置爲全局變量是一種很好的做法嗎? – Chubaka

+0

這取決於你將如何使用它。如果你從'main'函數內部驅動程序(通過在main中創建對象和調用函數),那麼你可以將它傳遞給那些需要它的對象和函數,或者用它來創建數據庫連接並傳遞它;在這種情況下,沒有理由讓它成爲全球性的(我就是這麼做的)。在我的例子中,我只讓它成爲一個更接近你的代碼的全局代碼。 – cco