【问题标题】:python lxml with py2exepython lxml与py2exe
【发布时间】:2013-02-07 21:04:14
【问题描述】:

我已经用 dom 生成了一个 XML,我想使用 lxml 来漂亮地打印 xml。

这是我用于漂亮打印 xml 的代码

def prettify_xml(xml_str):

   import lxml.etree as etree
   root = etree.fromstring(xml_str)
   xml_str =  etree.tostring(root, pretty_print=True)

   return xml_str

我的输出应该是一个 xml 格式的字符串。

我从 stactoverflow 的某个帖子中获得了这段代码。当我编译机智 python 本身时,这可以完美地工作。但是当我将我的项目转换为从 py2exe 创建的二进制文件时(我的二进制文件是带有命名管道的 Windows 服务)。我遇到了两个问题:

  1. 我的服务没有启动,我通过在 py2exe 函数的 includes 选项中添加 lxml.etree 解决了这个问题。然后我的服务正常启动。

  2. 在此处调用 xml 生成时,是我在日志中看到的错误 'module' object has no attribute 'fromstring'

我在哪里纠正这个错误?我的第一个问题的解决方案是否正确?

我的xml生成代码:

from xml.etree import ElementTree
from xml.dom import minidom
from xml.etree.ElementTree import Element, SubElement, tostring, XML 
import lxml.etree 


    def prettify_xml(xml_str):

      root = lxml.etree.fromstring(xml_str)
      xml_str =  lxml.etree.tostring(root, pretty_print=True)

      return xml_str

   def dll_xml(status):
    try:
        xml_declaration = '<?xml version="1.0" standalone="no" ?>'

        rootTagName='response'
        root = Element(rootTagName)
        root.set('id' , 'rp001')

        parent = SubElement(root, 'command', opcode ='-ac')

        # Create children
        chdtag1Name = 'mode'
        chdtag1Value = 'repreport'

        chdtag2Name='status'
        chdtag2Value = status

        fullchildtag1 = ''+chdtag1Name+' value = "'+chdtag1Value+'"'
        fullchildtag2=''+chdtag2Name+' value="'+chdtag2Value+'"'

        children = XML('''<root><'''+fullchildtag1+''' /><'''+fullchildtag2+'''/></root> ''')

        # Add parent
        parent.extend(children)
        dll_xml_doc = xml_declaration + tostring(root)

        dll_xml_doc = prettify_xml(dll_xml_doc)

        return dll_xml_doc

    except Exception , error:
       log.error("xml_generation_failed : %s" % error)

【问题讨论】:

  • 如果将导入移到方法定义之外还会发生吗?您确定 py2exe 使用的 python 版本与您正在测试的版本相同吗?
  • 我尝试将导入放在函数之外。我的服务现在没有启动。我不妨把我的代码放在上面
  • @michael-clerx,我已经检查了我的 python 版本和 py2exe 版本,它们都是同一类型。
  • 那我完全没主意了!
  • IIRC 你需要包括lxml._elementpath,但不是lxml.etree。见py2exe.org/index.cgi/WorkingWithVariousPackagesAndModules

标签: python xml-parsing lxml py2exe


【解决方案1】:

尝试使用PyInstaller 代替py2exe。我只是通过运行python pyinstaller.py YourPath\xml_a.py 将您的程序转换为二进制.exe 没有问题。

【讨论】:

    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 2012-12-22
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多