NameError: global name 'b' is not defined

NameError: global name 'b' is not defined

我有一个结构如下的脚本:

def func():
    bfile=open(b, 'r')
    cfile=open(c, 'r')
    dfile=open(d, 'r')

if __name__=='__main__':
    if len(sys.argv)==1:
        print 'guidence'
        sys.exit()
    else:
        opts,args=getopt.getopt(sys.argv,'b:c:d:a')
        a=False
        for opt,arg in opts:
            if opt=='-a':
                a=True
            elif opt=='-b':
                b=arg
            elif opt=='-c':
                c=arg
            elif opt=='-d':
                d=arg
        func()

我运行是这样的:

# python script.py -b file1 -c file1 -d file1

in func()
NameError: global name 'b' is not defined

我还定义了一个全局文件1。但没有工作。

更新

我知道问题出在哪里了: print opts 的结果是 []。 它没有价值。 为什么?

您必须将文件名传递给函数。在您的情况下,它应该如下所示:

def func(b, c, d):
  bfile = open(b, 'r')
  cfile = open(c, 'r')
  dfile = open(d, 'r')

你可以这样调用它:

b = 'nameB.txt'
c = 'nameC.txt'
d = 'nameD.txt'
func(b, c, d)

你有两个问题。

首先,getopt遇到非选项就停止。由于 sys.argv[0] 是脚本名称,因此它不是一个选项,解析就此停止。
您想将 sys.argv[1:] 传递给 getopt

这就是导致 print opts 显示 [] 的原因,并且由于 opts 为空,因此永远不会创建全局变量,这就是抱怨它们不存在的原因从。

其次,由于-a需要一个参数,所以它后面需要一个冒号。

总而言之,这应该有效:

opts, args = getopt.getopt(sys.argv[1:], 'b:c:d:a:')

此外,您不应在全局变量中传递参数。