Python 2.7 Python 2.7.11 getopt不读取参数

Python 2.7 Python 2.7.11 getopt不读取参数,python-2.7,getopts,Python 2.7,Getopts,在Python 2.7.13中 我们有以下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='' PAS

在Python 2.7.13中

我们有以下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
如果这里有什么不对劲,任何古鲁都能开导一下吗?谢谢。

服务器名称被定义为主函数的局部变量,因此它在全局范围内(代码底部的行)不可见。 您可以将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()

对不起,我不太明白。因此,如果我将if name==main:main移动到代码的最底部,在此之后不再有代码,它仍然返回NameError:name“SERVER\u name”未定义。你能开导一下吗?谢谢你开导我!现在我明白了。另一个问题:global dbServer=>将dbServer设置为全局变量是否是一种好的做法?这取决于您将如何使用它。如果您通过在main函数中创建对象和调用函数来驱动程序,那么您可以将其传递给需要它的对象和函数,或者使用它来创建数据库连接并传递;在这种情况下,它没有理由是一个全球性的,我会这样做。在我的示例中,我只是将其作为一个全局变量,以便更紧密地匹配您的代码。