When OSError happens during lxml.etree._XSLTResultTree.write_output,
exception
AttributeError: 'str' object has no attribute 'copy'
is raised, instead of some error indicating the real cause of the
problem.
Consider the following poor man's test to attempt to write to a file
in subdirectory which does not exist.
diff --git a/src/lxml/tests/test_xslt.py b/src/lxml/tests/test_xslt.py
index f6b48fb9..6fd5dada 100644
--- a/src/lxml/tests/test_xslt.py
+++ b/src/lxml/tests/test_xslt.py
@@ -223,6 +223,20 @@ class ETreeXSLTTestCase(HelperTestCase):
finally:
os.unlink(f.name)
+ def test_xslt_write_output_file_oserror(self):
+ with self._xslt_setup() as res:
+ f = NamedTemporaryFile(suffix='.xml.gz', delete=False)
+ name_in_subdir = f.name.replace('.xml.gz', '/a.xml.gz')
+ try:
+ try:
+ res[0].write_output(name_in_subdir, compression=1)
+ finally:
+ f.close()
+ with gzip.GzipFile(f.name) as f:
+ res[0] = f.read().decode("UTF-16")
+ finally:
+ os.unlink(f.name)
+
def test_xslt_unicode(self):
expected = '''
<?xml version="1.0"?>
When running this test, I get
======================================================================
ERROR: test_xslt_write_output_file_oserror (src.lxml.tests.test_xslt.ETreeXSLTTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/adelton/project/lxml/src/lxml/tests/test_xslt.py", line 232, in test_xslt_write_output_file_oserror
res[0].write_output(name_in_subdir, compression=1)
File "src/lxml/xslt.pxi", line 753, in lxml.etree._XSLTResultTree.write_output
if self._context_node is not None:
File "src/lxml/etree.pyx", line 207, in lxml.etree.LxmlError.__init__
else:
AttributeError: 'str' object has no attribute 'copy'
It seems like the handling within lxml.etree.LxmlError fails, making
it hard to catch the real error in the code which uses lxml.
--
Jan Pazdziora
Senior Principal Software Engineer, Security Engineering, Red Hat