Bug 1845744 - python3-openpyxl requires xml.etree.cElementTree which has been deprecated, removed from Python 3.9
Summary: python3-openpyxl requires xml.etree.cElementTree which has been deprecated, r...
Keywords:
Status: CLOSED RAWHIDE
Alias: None
Product: Fedora
Classification: Fedora
Component: python-openpyxl
Version: rawhide
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Julien Enselme
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
Depends On:
Blocks: PYTHON39 1843783
TreeView+ depends on / blocked
 
Reported: 2020-06-09 23:56 UTC by Mark Goodwin
Modified: 2020-06-16 21:04 UTC (History)
4 users (show)

Fixed In Version: python-openpyxl-3.0.3-1.fc33
Clone Of:
Environment:
Last Closed: 2020-06-16 21:04:30 UTC
Type: Bug
Embargoed:


Attachments (Terms of Use)

Description Mark Goodwin 2020-06-09 23:56:02 UTC
Description of problem: can't import openpyxl


Version-Release number of selected component (if applicable): python3-openpyxl-2.6.2-6.fc33.noarch


How reproducible: easily


Steps to Reproduce:
1. in a rawhide VM or chroot
2. python3 -c 'import openpyxl'
3.

Actual results: exception ModuleNotFoundError: No module named 'xml.etree.cElementTree'


Expected results: no exception


Additional info: https://docs.python.org/3.9/whatsnew/3.9.html#removed

"The xml.etree.cElementTree module has been removed, use the xml.etree.ElementTree module instead. Since Python 3.3 the xml.etree.cElementTree module has been deprecated, the xml.etree.ElementTree module uses a fast implementation whenever available."

According to mhroncok in BZ#1843783 :
/usr/lib/python3.9/site-packages/openpyxl/xml/functions.py


And the problem is, it has:

    from lxml.etree import XMLSyntaxError

    if DEFUSEDXML is True:
        from defusedxml.common import DefusedXmlException
        from defusedxml.cElementTree import iterparse
        from defusedxml.lxml import fromstring as _fromstring, tostring

        def fromstring(*args, **kwargs):
            try:
                return _fromstring(*args, **kwargs)
            except XMLSyntaxError as e:
                raise DefusedXmlException(str(e))
    else:
        from lxml.etree import fromstring, tostring
        from xml.etree.cElementTree import iterparse
        # do not resolve entities
        safe_parser = XMLParser(resolve_entities=False)
        fromstring = partial(fromstring, parser=safe_parser)

else:
    try:
        from xml.etree.cElementTree import (
        ElementTree,
        Element,
        SubElement,
        QName,
        register_namespace
        )
        if DEFUSEDXML is True:
            from defusedxml.cElementTree import (
            fromstring,
            tostring,
            iterparse,
            )
        else:
            from xml.etree.cElementTree import (
            fromstring,
            tostring,
            iterparse
            )
    except ImportError:
        from xml.etree.ElementTree import (
        ElementTree,
        Element,
        SubElement,
        QName,
        register_namespace
        )
        if DEFUSEDXML is True:
            from defusedxml.ElementTree import (
            fromstring,
            tostring,
            iterparse,
            )
        else:
            from xml.etree.ElementTree import (
            fromstring,
            tostring,
            iterparse,
            )
    from et_xmlfile import xmlfile





So it only fails if I install lxml:



<mock-chroot> sh-5.0# rpm -q python3-lxml
python3-lxml-4.5.1-1.fc33.x86_64


<mock-chroot> sh-5.0# python3 -c 'import openpyxl'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.9/site-packages/openpyxl/__init__.py", line 6, in <module>
    from openpyxl.workbook import Workbook
  File "/usr/lib/python3.9/site-packages/openpyxl/workbook/__init__.py", line 5, in <module>
    from .workbook import Workbook
  File "/usr/lib/python3.9/site-packages/openpyxl/workbook/workbook.py", line 8, in <module>
    from openpyxl.worksheet.worksheet import Worksheet
  File "/usr/lib/python3.9/site-packages/openpyxl/worksheet/worksheet.py", line 30, in <module>
    from openpyxl.cell import Cell, MergedCell
  File "/usr/lib/python3.9/site-packages/openpyxl/cell/__init__.py", line 4, in <module>
    from .cell import Cell, WriteOnlyCell, MergedCell
  File "/usr/lib/python3.9/site-packages/openpyxl/cell/cell.py", line 46, in <module>
    from openpyxl.utils.inference import (
  File "/usr/lib/python3.9/site-packages/openpyxl/utils/inference.py", line 10, in <module>
    from openpyxl.styles import numbers
  File "/usr/lib/python3.9/site-packages/openpyxl/styles/__init__.py", line 5, in <module>
    from .alignment import Alignment
  File "/usr/lib/python3.9/site-packages/openpyxl/styles/alignment.py", line 6, in <module>
    from openpyxl.descriptors import Bool, MinMax, Min, Alias, NoneSet
  File "/usr/lib/python3.9/site-packages/openpyxl/descriptors/__init__.py", line 5, in <module>
    from .sequence import Sequence
  File "/usr/lib/python3.9/site-packages/openpyxl/descriptors/sequence.py", line 5, in <module>
    from openpyxl.xml.functions import Element
  File "/usr/lib/python3.9/site-packages/openpyxl/xml/functions.py", line 40, in <module>
    from xml.etree.cElementTree import iterparse
ModuleNotFoundError: No module named 'xml.etree.cElementTree'



Also fails with both lxml and defusedxml:


<mock-chroot> sh-5.0# python3 -c 'import openpyxl'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.9/site-packages/openpyxl/__init__.py", line 6, in <module>
    from openpyxl.workbook import Workbook
  File "/usr/lib/python3.9/site-packages/openpyxl/workbook/__init__.py", line 5, in <module>
    from .workbook import Workbook
  File "/usr/lib/python3.9/site-packages/openpyxl/workbook/workbook.py", line 8, in <module>
    from openpyxl.worksheet.worksheet import Worksheet
  File "/usr/lib/python3.9/site-packages/openpyxl/worksheet/worksheet.py", line 30, in <module>
    from openpyxl.cell import Cell, MergedCell
  File "/usr/lib/python3.9/site-packages/openpyxl/cell/__init__.py", line 4, in <module>
    from .cell import Cell, WriteOnlyCell, MergedCell
  File "/usr/lib/python3.9/site-packages/openpyxl/cell/cell.py", line 46, in <module>
    from openpyxl.utils.inference import (
  File "/usr/lib/python3.9/site-packages/openpyxl/utils/inference.py", line 10, in <module>
    from openpyxl.styles import numbers
  File "/usr/lib/python3.9/site-packages/openpyxl/styles/__init__.py", line 5, in <module>
    from .alignment import Alignment
  File "/usr/lib/python3.9/site-packages/openpyxl/styles/alignment.py", line 6, in <module>
    from openpyxl.descriptors import Bool, MinMax, Min, Alias, NoneSet
  File "/usr/lib/python3.9/site-packages/openpyxl/descriptors/__init__.py", line 5, in <module>
    from .sequence import Sequence
  File "/usr/lib/python3.9/site-packages/openpyxl/descriptors/sequence.py", line 5, in <module>
    from openpyxl.xml.functions import Element
  File "/usr/lib/python3.9/site-packages/openpyxl/xml/functions.py", line 30, in <module>
    from defusedxml.cElementTree import iterparse
  File "/usr/lib/python3.9/site-packages/defusedxml/cElementTree.py", line 13, in <module>
    raise ImportError("cElementTree has been removed from Python 3.9")
ImportError: cElementTree has been removed from Python 3.9


This is a bug in openpyxl. It only happens when python3-lxml is installed.
This bug is preventing the PCP package from being built in rawhide (it has a builddep on python3-openpyxl).

Thanks

Comment 1 Miro Hrončok 2020-06-10 15:59:10 UTC
See also https://github.com/python/cpython/pull/20780 -- the removal will be reverted.

Comment 2 Charalampos Stratakis 2020-06-16 21:04:30 UTC
Fixed via updating to 3.0.3


Note You need to log in before you can comment on or make changes to this bug.