1

我试图弄清楚使用 ElementTree.parse 的两种情况有什么区别。在一种情况下它会崩溃,但在另一种情况下不会。

案例一 FreeCAD;在 FreeCAD 的 python 控制台中,我有以下内容:

Python 3.6.10 (default, Jan 16 2020, 09:12:04) [GCC] on linux
Type 'help', 'copyright', 'credits' or 'license' for more information.
>>> import sys
>>> sys.path
['/usr/lib64/FreeCAD/Mod/Web', '/usr/lib64/FreeCAD/Mod/Tux', '/usr/lib64/FreeCAD/Mod/Test', '/usr/lib64/FreeCAD/Mod/TechDraw', '/usr/lib64/FreeCAD/Mod/Surface', '/usr/lib64/FreeCAD/Mod/Start', '/usr/lib64/FreeCAD/Mod/Spreadsheet', '/usr/lib64/FreeCAD/Mod/Sketcher', '/usr/lib64/FreeCAD/Mod/Show', '/usr/lib64/FreeCAD/Mod/Ship', '/usr/lib64/FreeCAD/Mod/Robot', '/usr/lib64/FreeCAD/Mod/ReverseEngineering', '/usr/lib64/FreeCAD/Mod/Raytracing', '/usr/lib64/FreeCAD/Mod/Points', '/usr/lib64/FreeCAD/Mod/Plot', '/usr/lib64/FreeCAD/Mod/Path', '/usr/lib64/FreeCAD/Mod/PartDesign', '/usr/lib64/FreeCAD/Mod/Part', '/usr/lib64/FreeCAD/Mod/OpenSCAD', '/usr/lib64/FreeCAD/Mod/MeshPart', '/usr/lib64/FreeCAD/Mod/Mesh', '/usr/lib64/FreeCAD/Mod/Measure', '/usr/lib64/FreeCAD/Mod/Material', '/usr/lib64/FreeCAD/Mod/Inspection', '/usr/lib64/FreeCAD/Mod/Import', '/usr/lib64/FreeCAD/Mod/Image', '/usr/lib64/FreeCAD/Mod/Idf', '/usr/lib64/FreeCAD/Mod/Fem', '/usr/lib64/FreeCAD/Mod/Drawing', '/usr/lib64/FreeCAD/Mod/Draft', '/usr/lib64/FreeCAD/Mod/Complete', '/usr/lib64/FreeCAD/Mod/Arch', '/usr/lib64/FreeCAD/Mod/AddonManager', '/usr/lib64/FreeCAD/Mod', '/usr/lib64/FreeCAD/lib64', '/usr/lib64/FreeCAD/lib', '/usr/lib64/FreeCAD/Ext', '', '/usr/lib/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/usr/lib64/python3.6/site-packages', '/usr/lib64/python3.6/site-packages/PIL', '/usr/lib64/python3.6/_import_failed', '/usr/lib/python3.6/site-packages', '', '/usr/lib64/FreeCAD/Macro']
>>> import xml.etree.ElementTree as ElementTree
>>> tree=ElementTree.parse("/usr/lib64/FreeCAD/Mod/Material/MatPropDict.xml")

在这种情况下,解析文件会导致 FreeCAD 崩溃。

案例二独立;在独立的 python 控制台中,我有以下内容:

Python 3.6.10 (default, Jan 16 2020, 09:12:04) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append('/usr/lib64/FreeCAD/lib')
>>> import FreeCAD
FreeCAD 0.18, Libs: 0.18RUnknown
>>> sys.path
['/usr/lib64/FreeCAD/Mod/Web', '/usr/lib64/FreeCAD/Mod/Tux', '/usr/lib64/FreeCAD/Mod/Test', '/usr/lib64/FreeCAD/Mod/TechDraw', '/usr/lib64/FreeCAD/Mod/Surface', '/usr/lib64/FreeCAD/Mod/Start', '/usr/lib64/FreeCAD/Mod/Spreadsheet', '/usr/lib64/FreeCAD/Mod/Sketcher', '/usr/lib64/FreeCAD/Mod/Show', '/usr/lib64/FreeCAD/Mod/Ship', '/usr/lib64/FreeCAD/Mod/Robot', '/usr/lib64/FreeCAD/Mod/ReverseEngineering', '/usr/lib64/FreeCAD/Mod/Raytracing', '/usr/lib64/FreeCAD/Mod/Points', '/usr/lib64/FreeCAD/Mod/Plot', '/usr/lib64/FreeCAD/Mod/Path', '/usr/lib64/FreeCAD/Mod/PartDesign', '/usr/lib64/FreeCAD/Mod/Part', '/usr/lib64/FreeCAD/Mod/OpenSCAD', '/usr/lib64/FreeCAD/Mod/MeshPart', '/usr/lib64/FreeCAD/Mod/Mesh', '/usr/lib64/FreeCAD/Mod/Measure', '/usr/lib64/FreeCAD/Mod/Material', '/usr/lib64/FreeCAD/Mod/Inspection', '/usr/lib64/FreeCAD/Mod/Import', '/usr/lib64/FreeCAD/Mod/Image', '/usr/lib64/FreeCAD/Mod/Idf', '/usr/lib64/FreeCAD/Mod/Fem', '/usr/lib64/FreeCAD/Mod/Drawing', '/usr/lib64/FreeCAD/Mod/Draft', '/usr/lib64/FreeCAD/Mod/Complete', '/usr/lib64/FreeCAD/Mod/Arch', '/usr/lib64/FreeCAD/Mod/AddonManager', '/usr/lib64/FreeCAD/Mod', '/usr/lib64/FreeCAD/lib64', '/usr/lib64/FreeCAD/lib', '/usr/lib64/FreeCAD/Ext', '', '/usr/lib/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/usr/lib64/python3.6/site-packages', '/usr/lib64/python3.6/site-packages/PIL', '/usr/lib64/python3.6/_import_failed', '/usr/lib/python3.6/site-packages', '/usr/lib64/FreeCAD/lib', '', '/usr/lib64/FreeCAD/Macro']
>>> import xml.etree.ElementTree as ElementTree
>>> tree=ElementTree.parse("/usr/lib64/FreeCAD/Mod/Material/MatPropDict.xml")
>>> 

在这种情况下,似乎没有问题。

xml.etree 依赖的某些设置或初始化是否会导致这种差异?

以下简约 XML 也会发生崩溃

<?xml version="1.0" encoding="UTF-8"?>
<MatPropDict>
    <Group Name="User defined">
    </Group>
</MatPropDict>

编辑:

我发现了以下区别

from xml.parsers import expat
expat.EXPAT_VERSION

在 FreeCAD 中给出
“expat_2.0.1”,

而在控制台中给出
'expat_2.2.5'

但是我不明白差异来自哪里。在这两种情况下,lddon /usr/lib64/python3.6/lib-dynload/pyexpat.cpython-36m-x86_64-linux-gnu.so, (使用subprocess.Popen)列出相同的库。

谢谢托本

4

0 回答 0