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:')
此外,您不应在全局变量中传递参数。
我有一个结构如下的脚本:
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:')
此外,您不应在全局变量中传递参数。