2014-07-11 2 views
2

(Powerpoint 파일을 만들 때) Google App Engine에서 pptx-python을 사용하려고합니다. 나는 이미지가 필요 없기 때문에 필로우에 대한 의존성을 주석 처리했다. 버전 문제가있는 것을 제외하고는 거의 효과가있는 것으로 남았습니다. GAE의 lxml 버전은 2.3이고, 분명히 SubElement 메소드가 버전 2.3.2에 추가되었습니다.objectify에 Polyfill이 필요합니다 .SubElement

pptx 코드가 lxml 호출을 멋지게 랩핑하므로 응용 프로그램 수준에서 SubElement를 다시 작성하여이 문제를 해결할 수 있습니다. 불행히도, 나는 정말로 그 일을하는 첫 번째 단서가 없습니다. 그리고 lxml 코드는 C로 쓰여진 무언가를 둘러싸고있는 파이썬 래퍼처럼 보입니다. 그래서 며칠을 보내서 lxml에 익숙해지기 전에, 여러분 중 한 분이 나를 도울 수 있기를 바랍니다.

가 가
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에 의존하지 않도록 해당 기능을 다시 작성하는 방법을 말해 줄래하는 유일한 방법을 사용

는 PPTX/oxml/shared.py의 코드입니다 lxml 2.3에서 사용 가능합니까?

답변

2

GitHub에서 python-pptx의 개발 브랜치에는 SubElement가 있으며 실제로 모든 lxml.objectify는 lxml.etree 라이브러리 호출을 위해 제거되었습니다. 긴 이야기지만, 짧은 버전이 객관화되는 것은 규모면에서 그것을 사용하는 것보다 더 큰 문제가되었습니다.

그래서 개발 분기에서 설치할 수 있으면이 문제가 사라질 수 있습니다. 개발 지점은 마스터와 마찬가지로 안정적이며이 지점에서 약 1,000 개의 단위 테스트와 175 개의 통합/수용 테스트가 지원됩니다.

이제 시작하겠습니다. 당신이 어떻게 가는지 알려주세요 :)

실제로 제가 생각하기에, 위의 방법을 선호 할지라도, 파이썬 -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)''및 그 트릭을 했어! –

관련 문제