1

I'm trying to figure out what the difference is to two cases of using ElementTree.parse. In one case it crashes, but not in the other.

Case one FreeCAD; Inside FreeCAD's python console I have the following:

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")

In this case, parsing the file cause FreeCAD to crash.

Case two standalone; In a standalone python console I have the following:

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")
>>> 

In this case there seems to be no issue.

Is there some setting or initilization that xml.etree depends on that could cause this difference?

The crash also occurs with the following minimalistic XML

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

Edit:

I found the following difference

from xml.parsers import expat
expat.EXPAT_VERSION

in FreeCAD gives
'expat_2.0.1',

while in console gives
'expat_2.2.5'

However I can't understand where the difference comes from. In both cases, ldd on /usr/lib64/python3.6/lib-dynload/pyexpat.cpython-36m-x86_64-linux-gnu.so, (using subprocess.Popen) list the same libraries.

Thanks Torben

Torben
  • 51
  • 4
  • What kind of crash do you get? Do you have a stack trace to confirm that under FreeCAD it also uses the system python xml.etree? – mmlr Apr 11 '20 at 11:29
  • Two ideas: (1) Add `print(ElementTree.__file__)` before `parse` and check if it is equal for inside and outside of FreeCAD. (2) Try to cut down the XML file and check if parsing crashes for a reduced or minimal file. – Michael Butscher Apr 11 '20 at 11:35
  • In both cases I have /usr/lib64/python3.6/xml/etree/ElementTree.py – Torben Apr 11 '20 at 11:43
  • I edited the original question to show a minimalistic XML that also causes the issue. – Torben Apr 11 '20 at 11:54
  • The crash occurs with just parser=ElementTree.XMLParser() backtrace is here [1]:https://pastebin.com/74zUwZTT – Torben Apr 11 '20 at 14:43

0 Answers0