2017-08-13 5 views
0

Je souhaite générer une image caryotype avec le module biopython Bio/Graphics/BasicChromosome.py. Voici mon codepython3 renderPM (?) Filehandle pb (via biopython)

import sys 
import pprint # debug 
from Bio.Graphics import BasicChromosome 


diagram = BasicChromosome.Organism() 
diagram.output_format = "pdf" 

# Ok, it works 
# diagram.draw("toto.pdf", "test") 

# this one fail. 
with open("toto.pdf", 'w') as o_out: 
    diagram.draw(o_out, "test") 

Ce script génère un diagramme vide, dans le document pdf avec seulement le titre "test". Au moins, il devrait, et en fait, il le fait avec python2.

Avec python3, il échoue avec l'erreur suivante:

Traceback (most recent call last): 
    File "test_emptyKaryo.py", line 16, in <module> 
    diagram.draw(o_out, "test") 
    File "/usr/lib/python3/dist-packages/Bio/Graphics/BasicChromosome.py", line 161, in draw 
    return _write(cur_drawing, output_file, self.output_format) 
    File "/usr/lib/python3/dist-packages/Bio/Graphics/__init__.py", line 82, in _write 
    return drawmethod.drawToFile(drawing, output_file) 
    File "/usr/lib/python3/dist-packages/reportlab/graphics/renderPDF.py", line 298, in drawToFile 
    c.save() 
    File "/usr/lib/python3/dist-packages/reportlab/pdfgen/canvas.py", line 1237, in save 
    self._doc.SaveToFile(self._filename, self) 
    File "/usr/lib/python3/dist-packages/reportlab/pdfbase/pdfdoc.py", line 222, in SaveToFile 
    f.write(data) 
TypeError: write() argument must be str, not bytes 

Il semble que filehandle ne sont pas pris en charge plus. Je ne pense pas que ce soit une erreur biopython. Quelqu'un peut-il me donner un indice pour le faire fonctionner?

Si je change le format de sortie en png, le pdf n'est plus impliqué, donc je pense qu'il vient de renderPM.py.

Répondre

0

Vous devez soit passer des objets chaîne à votre objet fichier qui a été ouvert en mode string ou ouvrir votre fichier de sortie en mode binary (ce qui est plus facile dans ce cas).

with open("toto.pdf", 'wb') as o_out: 

devrait faire l'affaire.