Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从类中实例化python类作为字符串,仅在内存中可用!_Python_Reportlab - Fatal编程技术网

从类中实例化python类作为字符串,仅在内存中可用!

从类中实例化python类作为字符串,仅在内存中可用!,python,reportlab,Python,Reportlab,我正在使用Reportlab创建PDF。我正在创建两个PDF,我想在创建它们之后合并它们。Reportlab提供了一种将pycanvas(基本上是内存中的pdf文件)保存为python文件的方法,并对该python文件调用doIt(filename)方法,将重新创建pdf文件。这很好,因为您可以在源代码的基础上合并两个pdf,并创建一个合并pdf 这是这样做的: from reportlab.pdfgen import canvas, pycanvas #create your canvas p

我正在使用Reportlab创建PDF。我正在创建两个PDF,我想在创建它们之后合并它们。Reportlab提供了一种将pycanvas(基本上是内存中的pdf文件)保存为python文件的方法,并对该python文件调用doIt(filename)方法,将重新创建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保存到磁盘的步骤。因此,我正在寻找一种方法,从最终的pdf字符串实例化相应的python类,并直接在源代码中使用它。这可能吗

它应该是这样工作的

n2 = instantiate_python_class_from_source(final_pdf)
p = n2.doIt(buffer)
这主要是因为实际上不需要将源代码保存到磁盘,其次,它绝对不是线程保存。我可以在运行时为创建的文件命名,但是我不知道导入什么!?如果没有办法阻止文件保存,是否有办法根据运行时定义的文件名定义导入


有人可能会问我为什么不提前创建一个pdf,但这是不可能的,因为它们来自不同的应用程序。

好的,我想您可以使用提供标准解释器交互模式的代码模块。下面将执行函数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
导入代码
导入字符串
编码的_数据=”“
def doIt():
打印“XXXXX”
"""
脚本=编码的\u数据+“\n脚本()\n”
co=代码。编译_命令(脚本,“,”exec“)
如果公司:
执行公司

如果这有帮助,请告诉我。

这似乎离你想要的东西还有很长的路要走。Reportlab没有画布类,您可以从中提取PDF文档吗?我不明白为什么这里应该包含生成的Python源代码

但如果出于某种原因需要,则可以使用StringIO将源代码“写入”字符串,然后使用exec执行:

from cStringIO import StringIO

source_code = StringIO()
source_code.write(final_pdf)
exec(source_code)
p = doIt(buffer)

您提供的代码真的是解释问题所需的最低限度吗?很长。谢谢,但我还不确定它是否有用;-)我需要将方法调用doIt(buffer)的返回值分配给p,就像我对这个语句所做的那样:p=n2.doIt(buffer)。。这可能吗?嗯。。仅仅调用doIt(buffer)是行不通的,因为doIt()是序列化pycanvas的一个方法。如果您可以将其写入n2.py,然后导入n2,然后调用n2.doIt(),那么我的代码也应该可以工作。看起来确实有一种更简单的方法,你是对的。我放弃了合并的想法,正在重组整个系统,以便能够动态创建这个合并的pdf。