2017-06-16 402 views
4

当我运行单元测试时,我在下面的代码中的“logo”图像上得到了Python 3未关闭的缓冲区错误。如何正确关闭徽标图像缓冲区?请注意,Image班来自reportlab.platypusPython3:Reportlab Image - ResourceWarning:unclosed file <_io.BufferedReader name = ...>

我试过logo.close()with Image(logo_path) as logo:,它们都不起作用。

>>python -m unittest tests.test_sample_pdf 

>>/tests/test_sample_pdf.py:51: ResourceWarning: unclosed file <_io.BufferedReader name='/Users/my_prj/statics/my-logo.gif'> 
     get_pdf() 

源代码

import unittest 
import os 
from io import BytesIO 
from os.path import abspath, dirname 
from reportlab.lib.colors import HexColor 
from reportlab.lib.enums import TA_RIGHT 
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle 
from reportlab.lib.units import inch, cm, mm 
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, BaseDocTemplate, Paragraph, Image, Spacer 


COL_SORT = [{"headerName": "name", 
      "field": "name", 
      "width": 1000,}] 

def get_pdf(): 
    # setup PDF template 
    buffer = BytesIO() 
    side_margin = 12 
    col_widths = [row['width'] for row in COL_SORT] 
    page_width = sum(col_widths) + side_margin * 3 
    pdf = SimpleDocTemplate(buffer, pagesize=(page_width, 8.5 * inch), rightMargin=side_margin, leftMargin=side_margin, 
          topMargin=side_margin, bottomMargin=side_margin) 
    elements = [] 

    # logo 
    parent_dir = dirname(dirname(abspath(__file__))) 
    logo_path = os.path.join(parent_dir, 'statics', 'my-logo.gif') 
    logo = Image(logo_path) 
    logo.hAlign = 'LEFT' 

    heading_style = ParagraphStyle(name='heading', fontSize=16, leading=20, spaceAfter=0, 
            textColor=HexColor('#ffffff'), backColor=HexColor('#465a81')) 
    heading_right_style = ParagraphStyle(name='heading', fontSize=16, leading=20, spaceAfter=0, 
             textColor=HexColor('#ffffff'), backColor=HexColor('#465a81'), 
             alignment=TA_RIGHT) 
    logo_tbl = Table([[logo]], colWidths=sum(col_widths)) 
    logo_tbl.hAlign = 'LEFT' 
    logo_tbl.setStyle(TableStyle([('BACKGROUND', (0, 0), (-1, -1), HexColor('#B90002'))])) 
    elements.append(logo_tbl) 

    # build PDF 
    pdf.build(elements) 
    pdf_string = buffer.getvalue() 
    buffer.close() 

class TestPDF(unittest.TestCase): 
    def test_pdf(self): 
     get_pdf() 
+0

'德尔logo'不一定关闭文件。 – ForceBru

+0

显示完整追踪 – stovfl

+0

我已经显示完整的Traceback和完整的源代码。 – user1187968

回答

5

似乎reportlab预计打开和关闭图像文件。使用with open(logo_path, 'rb') as image_fd:

此变通办法解决了警告。我已经添加了提到的with并缩进了以下几行。

def get_pdf(): 
    # setup PDF template 
    buffer = BytesIO() 
    side_margin = 12 
    col_widths = [row['width'] for row in COL_SORT] 
    page_width = sum(col_widths) + side_margin * 3 
    pdf = SimpleDocTemplate(buffer, pagesize=(page_width, 8.5 * inch), rightMargin=side_margin, leftMargin=side_margin, 
          topMargin=side_margin, bottomMargin=side_margin) 
    elements = [] 

    # logo 
    parent_dir = dirname(dirname(abspath(__file__))) 
    logo_path = os.path.join(parent_dir, 'statics', 'nci-logo.gif') 
    with open(logo_path, 'rb') as image_fd:   # edited this line 
     logo = Image(image_fd)       # ... and this line 
     logo.hAlign = 'LEFT' 

     heading_style = ParagraphStyle(name='heading', fontSize=16, leading=20, spaceAfter=0, 
            textColor=HexColor('#ffffff'), backColor=HexColor('#465a81')) 
     heading_right_style = ParagraphStyle(name='heading', fontSize=16, leading=20, spaceAfter=0, 
             textColor=HexColor('#ffffff'), backColor=HexColor('#465a81'), 
             alignment=TA_RIGHT) 
     logo_tbl = Table([[logo]], colWidths=sum(col_widths)) 
     logo_tbl.hAlign = 'LEFT' 
     logo_tbl.setStyle(TableStyle([('BACKGROUND', (0, 0), (-1, -1), HexColor('#B90002'))])) 
     elements.append(logo_tbl) 

     # build PDF 
     pdf.build(elements) 
     pdf_string = buffer.getvalue() 
     buffer.close() 

输出:

$ python -m unittest tests.test_sample_pdf 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.042s 

OK 

我已经把完整的示例中Github

相关问题