2014-07-11 4 views
2

Я пытаюсь использовать pptx-python в Google App Engine (для создания файла PowerPoint). Мне не нужны изображения, поэтому я просто прокомментировал зависимости от подушки. Это оставило меня с чем-то, что почти работает, за исключением того, что у меня проблема с версией. Версия lxml в GAE равна 2,3, и, по-видимому, метод SubElement был добавлен в версии 2.3.2.Мне нужен полипол для objectify.SubElement

Код pptx красиво обертывает вызовы lxml, поэтому, похоже, я мог обойти это, переписав SubElement на уровне приложения. К сожалению, у меня действительно нет первой подсказки, как это сделать. И код lxml, по-видимому, просто является оболочкой python вокруг написанного на C. Итак, прежде чем я потрачу пару дней на скорость на 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

Разветвленная ветвь python-pptx на GitHub имеет SubElement и фактически все lxml.objectify удалены в пользу вызовов библиотеки lxml.etree. Длинная история, но короткая версия объективирует, было больше проблем, чем стоило при ее использовании в масштабе.

Так что если вы можете установить его из ветки развития, эта проблема может исчезнуть. Развивающая отрасль так же стабильна, как и ведущий, на них оба поддерживаются примерно 1000 модульных тестов на данный момент и 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) '' и это сделал трюк! –

Смежные вопросы