Python NameError,但变量肯定已定义
def make_pdf(self):
self.get_filez()
self.get_client()
file_name = self.client_id+"_"+self.client_name+"_"+self.batch_num
style = libxslt.parseStylesheetDoc(self.xsl_file)
transformation = style.applyStylesheet(self.xml_file,None)
style.saveResultToFilename("tmp/"+file_name+".fo",transformation,0)
style.freeStylesheet()
self.xml_file.freeDoc()
transformation.freeDoc()
fop_cmd = "/usr/bin/xmlgraphics-fop"
#file_name = self.tpa+"_"+self.be+"_"+self.batch_num
cmd = [fop_cmd,"-fo","tmp/"+file_name+".fo","-pdf","tmp/"+file_name+".pdf"]
#fop_transform = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
#fop_log = "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"
#fop_log = fop_log + time.strftime('%Y-%m-%d %R:%S')+"\n"
#fop_log = fop_log + file_name+".fo" + "\n"
#fop_log = fop_transform.communicate()[0]+"\n"
#f = open("/tmp/error_log","a")
#f.write(fop_log)
#f.close()
好的,如果我把cmd变量的声明注释掉,代码就能正常运行,并且可以正确生成一个fo文件。但是如果像上面那样不注释,我就会遇到一个NameError,提示file_name没有定义(其实它在最上面已经定义了)。如果我把cmd声明上面那个file_name的第二个声明取消注释,就会出现一个NameError,提示self有问题。在过去遇到这种情况时,通常是语法错误。我找不到问题所在,请帮帮我!
当file_name的第二个声明被注释掉时:
Traceback (most recent call last):
File "make_pdfs.py", line 11, in ?
from MakePdfs import MakePdfs
File "/home/khouser/removed/removed/MakePdfs.py", line 16, in ?
class MakePdfs:
File "/home/khouser/removed/removed/MakePdfs.py", line 39, in MakePdfs
cmd = [fop_cmd,"-fo","tmp/"+file_name+".fo","-pdf","tmp/"+file_name+".pdf"]
NameError: name 'file_name' is not defined
当file_name的第二个声明被取消注释时:
Traceback (most recent call last):
File "make_pdfs.py", line 11, in ?
from MakePdfs import MakePdfs
File "/home/khouser/removed/removed/MakePdfs.py", line 16, in ?
class MakePdfs:
File "/home/khouser/removed/removed/MakePdfs.py", line 38, in MakePdfs
file_name = self.tpa+"_"+self.be+"_"+self.batch_num
NameError: name 'self' is not defined
3 个回答
0
如果你在这里给 file_name
赋值:
file_name = self.client_id+"_"+self.client_name+"_"+self.batch_num
但你遇到了 NameError
的错误,提示 file_name
没有定义,那么你可以试着把这个操作放在 try..except
里面,这样可以看看到底出了什么问题:
try:
file_name = self.client_id+"_"+self.client_name+"_"+self.batch_num
except NameError as err:
print err, 'failed, here is some debug stuff:'
print "CLIENT ID =", self.client_id
print "CLIENT NAME =", self.client_name
print "BATCH NUM =", self.batch_num
如果其中任何一步失败了,这样做可以帮助你找到问题所在,并缩小问题的范围。
1
试着在每一行后面打印出文件名,看看是否有人在你的命名空间里把“file_name”这个变量给删掉了。
另外,为了让代码更符合Python的风格(也更高效),可以使用
file_name = "_".join((self.client_id, self.client_name, self.batch_num))
来连接字符串。
2
有时候,你的文件里可能会有一些看不见的控制字符,这会导致神秘的名称错误。在Unix系统上,你可以通过查看以下命令的输出,来发现这些错误。
cat -A filename.py