создать экземпляр класса Python из класса, доступного как строка, только в памяти! - PullRequest
0 голосов
/ 28 августа 2010

Я использую Reportlab для создания PDF-файлов.Я создаю два PDF-файла, которые я хочу объединить после того, как я их создал.Reportlab предоставляет способ сохранить pycanvas (исходный код) (который по сути является моим pdf-файлом в памяти) в виде файла python, а вызов метода doIt (filename) для этого файла python создаст файл pdf заново.,Это замечательно, так как вы можете объединить два PDF-файла на основе исходного кода и создать один PDF-файл слияния.

Это делается так:

from reportlab.pdfgen import canvas, pycanvas
#create your canvas
p = pycanvas.Canvas(buffer,pagesize=PAGESIZE)
#...instantiate your pdf...

# after that, close the PDF object cleanly.
p.showPage()
p.save()

#now create the string equivalent of your canvas
source_code_equiv = str(p)
source_code_equiv2 = str(p)

#merge the two files on str. basis
#not shown how it is exactly done, to make it more easy to read the source
#actually one just have to take the middle part of source_code_equiv2 and add it into source_code_equiv
final_pdf = source_code_equiv_part1 + source_code_equiv2_center_part + source_code_equiv_part2

#write the source-code equivalent of the pdf
open("n2.py","w").write(final_pdf)
from myproject import n2
p = n2.doIt(buffer)

# Get the value of the StringIO buffer and write it to the response.
pdf = buffer.getvalue()
buffer.close()
response.write(pdf)
return response  

Это отлично работает, но я хочу пропуститьшаг, который я сохраняю n2.py на диск.Таким образом, я ищу способ создания экземпляра из строки final_pdf соответствующего класса python и использования его непосредственно в исходном коде.Возможно ли это?

Это должно работать как-то так ..

n2 = instantiate_python_class_from_source(final_pdf)
p = n2.doIt(buffer)

Причина этого заключается главным образом в том, что на самом деле нет необходимости сохранять источник на диск, и, во-вторых,что это абсолютно не нить сохранить.Я мог бы назвать созданный файл во время выполнения, но тогда я не знаю, что импортировать !?Если нет способа предотвратить сохранение файла, есть ли способ определить импорт на основе имени файла, которое определяется во время выполнения!?

Кто-то может спросить, почему я не создаю один pdfзаранее, но это невозможно, поскольку они поступают из разных приложений.

Ответы [ 2 ]

1 голос
/ 28 августа 2010

Это кажется очень длинным путем к тому, что вы хотите.Разве в Reportlab нет класса Canvas, из которого вы можете извлечь документ PDF?Я не понимаю, почему сгенерированный исходный код Python должен быть задействован здесь.

Но если по какой-то причине это необходимо, то вы можете использовать StringIO для «записи» источника в строку, а затем exec для его выполнения.:

from cStringIO import StringIO

source_code = StringIO()
source_code.write(final_pdf)
exec(source_code)
p = doIt(buffer)
0 голосов
/ 28 августа 2010

Хорошо, я думаю, вы могли бы использовать модуль кода, который обеспечивает интерактивный режим стандартного интерпретатора.Следующее будет выполнять функцию doIt.

import code
import string
coded_data = """
def doIt():
    print "XXXXX"
"""
script = coded_data + "\ndoIt()\n" 
co = code.compile_command(script, "<stdin>", "exec")
if co:
    exec co

Дайте мне знать, если это помогло.

...