Python 2.7 将工具从windows迁移到linux时发生lxml错误

Python 2.7 将工具从windows迁移到linux时发生lxml错误,python-2.7,lxml,Python 2.7,Lxml,我在Python2.7中开发了一个工具,它将xsd文件作为输入, 并将过程数据放入测试文件中 在处理我使用的lxml文件xsd期间,我无法解决此类错误 AttributeError: 'Element' object has no attribute 'iterdescendants' 我不知道lxml库有什么问题 我想知道python 2.7是否有任何与Linux兼容的版本 我已在文件中导入如下内容: try: from lxml import etree except Impor

我在Python2.7中开发了一个工具,它将xsd文件作为输入, 并将过程数据放入测试文件中 在处理我使用的lxml文件xsd期间,我无法解决此类错误

 AttributeError: 'Element' object has no attribute 'iterdescendants'
我不知道lxml库有什么问题

我想知道python 2.7是否有任何与Linux兼容的版本 我已在文件中导入如下内容:

try:
    from lxml import etree
except ImportError:
    import xml.etree.ElementTree as etree
我只在文件中导入了元素,并将处理该元素的元素树指针发送到另一个文件中, 在声明的文件中是OK的,仅在另一个文件中给出错误

引发错误的代码是:

for tdocNode in lincFileRootNode:
    rootNode =  tdocNode.getroot()
    lchildren = rootNode.getchildren()
    for elt in lchildren:
        if 'complex' == elt.tag:
            if 'name' in  elt.attrib:
                if 'element' == item.tag:
                    if 'type' in item.attrib:
                        if elt.attrib['name'] == item.attrib['type']:
                            for key in elt.iterdescendants(tag='element'):
                                bIsElemTypeSimple = false
                                bIsElemTypeSimple = process_elementtype(key, lincFileRootNode)
其中:

lincFileRootNode  --> is list that containe the xsd file pointer to be processed
引发的错误是:

Traceback (most recent call last):
  File "run.py", line 1210, in <module>
    iret = xsd2dic_main()
  File "run.py", line 71, in xsd2dic_main
    iRet = yxsdtodic()
  File "run.py", line 352, in yxsdtodic
    iret = process_xsdfile(sXsdPath)
  File "run.py", line 485, in xsdfile
    sRet = process_dic_elementtype(item,lincFileRootNode)
  File "run.py", line 817, in process_dic_elementtype
    for key in elt.iterdescendants(tag='element'):
AttributeError: 'Element' object has no attribute 'iterdescendants'
回溯(最近一次呼叫最后一次):
文件“run.py”,第1210行,在
iret=xsd2dic_main()
xsd2dic_main中第71行的文件“run.py”
iRet=yxsdtodic()
YXSTODIC中第352行的文件“run.py”
iret=processxsdfile(sXsdPath)
xsdfile中第485行的文件“run.py”
sRet=进程\u dic\u元素类型(项目,lincFileRootNode)
文件“run.py”,第817行,进程中元素类型
对于elt.ITerDescents中的键(tag='element'):
AttributeError:“Element”对象没有属性“IterDescents”
在这两种情况下,我都感到疲劳:

1:将所有代码写入同一个文件中 2:写入不同的文件


不过我还是得到了同样的错误,这主要是猜测,但请仔细研究一下


您似乎是从
lxml
元素的实现
类型调用的。但是,如果
lxml
导入失败,您将转而使用Python内置的
xml
库。但是它的实现没有任何类型的
iterdescendants
方法。换句话说,这两个实现具有不同的公共API。添加一些
print
语句以查看要导入的库,并进行一些额外的检查,以查看
类型
是什么。如果您希望能够使用Python内置的
xml
,则需要对代码进行结构化以适应不同的API。

解决问题所需的任何其他信息请告诉我,因为导入
不会导致错误,最好将其从问题中删除。相反,确定实际使用的导入,在问题中指出,并向我们显示引发错误的代码。如果你能创建一个。(你甚至可以自己在这个过程中找到答案。)我已经更新了场景和代码snipest,当我打印“elt”时,它的打印方式当打印“elt”时:我如何打印它是哪个库using@AzamKhan通过在try/except中放入
print
语句,可以判断正在使用哪个导入。你正在接受一个例外。除非你在里面放了一些代码来通知某人,否则你根本不知道发生了什么。这就是为什么默默地接受异常是不好的。我不清楚你在说什么,现在我只是使用import xml.etree.ElementTree作为etree,但我没有得到你想要的。我没有意识到你取消了
lxml
导入;我不明白你在哪里提到的。如果这是正确的,那么错误是因为
xml
API中不存在此方法。当您在
lchildren
上循环时,它包含
xml.etree.ElementTree.Element
对象,而这些对象没有
iterdescendants
方法,正如我在回答中提到的那样。如果要使用
xml.etree
,必须重写代码以使用其方法。