1

如何使用pyfakefs运行lxml

import os
import unittest
from lxml import etree
from pyfakefs import fake_filesystem_unittest

class TestExample(fake_filesystem_unittest.TestCase):
    def setUp(self):
        self.setUpPyfakefs()

    def test_lxml(self):
        os.mkdir('/test')

        root = etree.Element("root")
        tree = etree.ElementTree(root)
        tree.write('/test/file.xml')

if __name__ == "__main__":
    unittest.main()

运行上面的示例时,我收到此错误:

Traceback (most recent call last):
  File "example_test.py", line 25, in test_lxml
  File "src/lxml/lxml.etree.pyx", line 2033, in lxml.etree._ElementTree.write (src/lxml/lx
ml.etree.c:63707)
  File "src/lxml/serializer.pxi", line 512, in lxml.etree._tofilelike (src/lxml/lxml.etree
.c:134950)
  File "src/lxml/serializer.pxi", line 571, in lxml.etree._create_output_buffer (src/lxml/
lxml.etree.c:135614)
  File "src/lxml/serializer.pxi", line 560, in lxml.etree._create_output_buffer (src/lxml/
lxml.etree.c:135415)
IOError: [Errno 2] No such file or directory

我在 macOS 10.12.4 上的 Python 2.7.13 中使用 lxml 3.6.4 和 pyfakefs 3.1

4

1 回答 1

0

仅供参考:lxml不适用于 pyfakefs。从文档中:

pyfakefs 不适用于使用 C 库访问文件系统的 Python 库(os 和 io 除外),因为它无法修补底层 C 库的文件访问功能

从故障排除章节:

pyfakefs 使用 C 库来访问文件系统。没有办法让这样的模块与 pyfakefs 一起工作——如果你想使用它,你必须修补整个模块。在某些情况下,已经存在用 Python 实现的具有类似接口的库。一个例子是 lxml,在大多数情况下可以用 ElementTree 代替它进行测试。

( @mzjn 的评论中也提到了lxml替换xml.etree.ElementTree为测试的替代方法)。

于 2020-08-22T19:09:08.873 回答