Python NameError,但变量肯定已定义

2 投票
3 回答
886 浏览
提问于 2025-04-16 16:14
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

撰写回答