2017-03-07 79 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