2014-07-11 77 views
2

我试图在Google App Engine上使用pptx-python(创建一个powerpoint文件)。我不需要图像,所以我只是评论了枕头的依赖关系。这给我留下了几乎可行的东西,除了我有版本问题。 GAE中的lxml版本是2.3,显然在版本2.3.2中添加了SubElement方法。我需要一个对象填充。SubElement

pptx代码很好地包装了lxml调用,所以看起来我可以通过在应用程序级别重写SubElement来解决此问题。不幸的是,我真的没有第一个线索如何做到这一点。而lxml代码似乎只是用C编写的东西的python包装器。所以在我花费几天时间来加速lxml之前,我希望你们中的一位天才能够帮助我。

这是PPTX/OXML/shared.py代码:

def SubElement(parent, nsptag_str, **extra): 
    """ 
    Return an lxml element having *nsptag_str*, newly added as a direct child 
    of *parent*. The new element is appended to the sequence of children, so 
    this method is not suitable if the child element must be inserted at a 
    different position in the sequence. The class of the returned element is 
    the custom element class for its tag, if one is defined. Additional 
    named parameters defined on lxml ``makeelement()`` are accepted, such as 
    attrib=attr_dct and e.g. ``visible='1'``. 
    """ 
    nsptag = NamespacePrefixedTag(nsptag_str) 
    return objectify.SubElement(
     parent, nsptag.clark_name, nsmap=nsptag.nsmap, **extra 
    ) 

有人能告诉我如何重写功能,使得它不依赖于objectify.SubElement,而是只使用方法可用lxml 2.3?

回答

2

GitHub上的python-pptx开发分支具有SubElement,实际上所有lxml.objectify都被移除,以支持lxml.etree库调用。长话短说,但简短的版本是客观化的,比在大规模使用时更有价值。

所以如果你可以从开发分支安装这个问题可能会消失。开发部门与主部门一样稳定,在这一点上它们都有大约1,000个单元测试和175个集成/验收测试。

这就是我要开始的地方。让我们知道你怎么去:)

其实,现在我想到了,虽然我更喜欢上面的方法,因为这意味着你不必固定你的python-pptx版本,这可能会做的伎俩:

def SubElement(parent, nsptag_str, **extra): 
    nsptag = NamespacePrefixedTag(nsptag_str) 
    nsmap = nsptag.nsmap 
    element = oxml_parser.makeelement(nsptag.clark_name, nsmap=nsmap, **extra) 
    parent.append(element) 
    return element 
+0

添加了一个可能重写SubElement()的情况下,事实证明更方便。 – scanny

+0

我添加了该代码,并将一些传递cleanup_namespaces = True的地方改为使用lxml.etree.cleanupnamespaces:''etree.cleanup_namespaces(txBody) objectify.deannotate(txBody)#,cleanup_namespaces = True)''和那就是诀窍! –