2017-06-16 3 views
4

Wenn ich einen Komponententest ausführen, bekomme ich Python 3 Unclosed Puffer Fehler auf dem "Logo" Bild im folgenden Code. Wie schließe ich den Logobildpuffer richtig? Bitte beachten Sie, dass die Klasse Image von reportlab.platypus kommt.Python3: Reportlab Bild - ResourceWarning: nicht geschlossene Datei <_io.BufferedReader name = ...>

Ich habe versucht logo.close() und with Image(logo_path) as logo:, beide funktionieren nicht.

>>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() 

Source Code

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

'del logo' schließt nicht unbedingt die Datei. – ForceBru

+0

Zeigen Sie voll Traceback – stovfl

+0

Ich habe den vollständigen Traceback und vollständigen Quellcode gezeigt. – user1187968

Antwort

5

Es scheint, dass reportlab dass Datei öffnen und schließen Sie das Bild erwartet. Verwenden Sie with open(logo_path, 'rb') as image_fd:.

Diese Problemumgehung löst die Warnung. Ich habe die erwähnte with hinzugefügt und die folgenden Zeilen eingerückt.

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() 

Ausgang:

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

OK 

ich das komplette Beispiel gesetzt haben in Github

Verwandte Themen