Python lxml.etree.tostring()中的缩进在Mac和Linux中有所不同

Python lxml.etree.tostring()中的缩进在Mac和Linux中有所不同,python,linux,macos,lxml,Python,Linux,Macos,Lxml,Python的lxml.etree.tostring()在Mac和Linux上的缩进不同——缩进的长度似乎是Linux上的两倍。它破坏了我的单元测试 显然,lxml.etree没有公开任何用于设置默认缩进值的路径 有人知道这里会发生什么吗 编辑以添加代码: 我确信代码是一样的,计算机通过github共享它 以下是测试代码: chk = """\ <field> <id>7135260</id> <name>lastn

Python的lxml.etree.tostring()在Mac和Linux上的缩进不同——缩进的长度似乎是Linux上的两倍。它破坏了我的单元测试

显然,lxml.etree没有公开任何用于设置默认缩进值的路径

有人知道这里会发生什么吗

编辑以添加代码:

我确信代码是一样的,计算机通过github共享它

以下是测试代码:

    chk = """\
<field>
      <id>7135260</id>
      <name>lastname</name>
      <label>Last Name</label>
      <type/>
    </field>"""

        res = etree.tostring((xml_obj.xpath(xp_str))[0], pretty_print=True)

        self.assertMultiLineEqual(
            chk,
            res.rstrip()
        )
chk=”“”\
7135260
姓氏
姓
"""
res=etree.tostring((xml_obj.xpath(xp_str))[0],pretty_print=True)
self.assertmultiliequal(
chk,
res.rstrip()
)
此操作在Linux上进行,但在Mac上失败,错误报告如下:

-       <id>7135260</id>
+             <id>7135260</id>
? ++++++
-       <name>lastname</name>
+             <name>lastname</name>
? ++++++
-       <label>Last Name</label>
+             <label>Last Name</label>
? ++++++
-       <type/>
+             <type/>
? ++++++
-     </field>
+         </field>
? ++++
-7135260
+             7135260
? ++++++
-姓氏
+姓氏
? ++++++
-姓
+姓
? ++++++
-       
+             
? ++++++
-     
+         
? ++++
但当我分离出有问题的代码时,它在两个方面的输出都是相同的:

data_str    =   """\
<response>
  <fields>
    <field>
      <id>7135259</id>
      <name>firstname</name>
      <label>First Name</label>
      <type/>
    </field>
    <field>
      <id>7135260</id>
      <name>lastname</name>
      <label>Last Name</label>
      <type/>
    </field>
  </fields>
  <status>success</status>
</response>
"""

data_xml    =   etree.fromstring(data_str)

res = etree.tostring(
        (data_xml.xpath('//*[name="lastname"]/name/..'))[0], 
        pretty_print=True)

print res
data_str=”“”\
7135259
名字
名字
7135260
姓氏
姓
成功
"""
data\u xml=etree.fromstring(data\u str)
res=etree.tostring(
(data_xml.xpath('/*[name=“lastname”]/name/.)[0],
漂亮(打印=真实)
打印资源
这会在两个平台上产生相同的压痕

因此,无论奇怪之处是什么,它都是由unittest2引起的。在这一点上,这可能不是一个很好的问题

进一步编辑:

在repr()中包装比较项时,我得到以下结果:

- '<field>\n      <id>7135260</id>\n      <name>lastname</name>\n      <label>Last Name</label>\n      <type/>\n    </field>'
+ '<field>\n            <id>7135260</id>\n            <name>lastname</name>\n            <label>Last Name</label>\n            <type/>\n        </field>\n        \n'
?           ++++++                        ++++++                                   ++++++                                ++++++             ++++        ++++++++++++
-'\n 7135260\n lastname\n lastname\n\n'
+“\n 7135260\n lastname\n lastname\n\n\n”
?           ++++++                        ++++++                                   ++++++                                ++++++             ++++        ++++++++++++
这个输出实际上是一行的。我已经插入了换行符+符号和?性格

我已在测试输出中搜索选项卡('\t')。我确定我没有插入制表符,我使用的是vi w/“set expandtab”

在每种情况下,对
tostring()
使用的参数是否完全相同?您是否尝试过关闭缩进以检查这是否真的是问题所在

显示调用tostring()的代码。创建一个小示例树,向我们展示每个操作系统上的print len(result_of_tostring)、repr(result_of_tostring)的结果。另外,请告诉我们如何将结果传输到其他系统进行比较,并向我们展示该比较的代码

更新:您的“chk”字符串缩进看起来可疑。我认为lxml没有什么问题,而且您有一个实验性错误,它有空格差异。您是否从代码中删除了所有选项卡?是否确实没有使用编辑器打开/保存代码,该编辑器将选项卡替换为空格,反之亦然?为什么不按照建议使用repr()来准确/明确地显示不相等的字符串是什么


更新2:在源代码中搜索选项卡。显示的“chk”源的大多数行的缩进为6。

您可以编写一个assertXMLEqual方法,在比较之前只剥离缩进。您的测试应该检查您测试的函数中的xml dom是否正确,序列化和缩进的方式与此无关。

我会使用另一个库---我发现
etree
在打印/格式化xml方面非常差。source中没有选项卡--如前所述,source在vi中编辑,设置为使用空格而不是制表符。