Python lxml etree.tostring()返回在mod_wsgi

时间:2016-12-09 00:37:34

标签: python wsgi

我在CentOS 6.8上有Python 2.7.8,我的服务器是基于Apache2 + WSGI构建的。我的应用程序应该使用http POST处理收到的日期,然后根据从本地.xml文件获取的XML模板创建一条指令。最后,它必须以200 OK响应发回xml指令。该应用程序的逻辑似乎工作正常,我可能会看到我更新的xml树:

print etree.tostring(root, pretty_print=True, xml_declaration-True, encoding='UTF-8')

问题似乎发生在我的代码的下一行,我正在进行相同的操作,但尝试将输出分配给变量:

xml_body = etree.tostring(root, pretty_print=True, xml_declaration-True, encoding='UTF-8')

print xml_body

输出为空字符串,因此我的应用程序不会返回给Apache。

我的环境信息可能会有所帮助:

==For bug report ===
Python              : sys.version_info(major=2, minor=7, micro=8, releaselevel='final', serial=0)
lxml.etree          : (3, 6, 4, 0)
libxml used         : (2, 7, 6)
libxml compiled     : (2, 9, 4)
libxslt used        : (1, 1, 26)
libxslt compiled    : (1, 1, 29)

它看起来与此bug report相似但是,作者提到它根本不起作用。还有一个request包含类似问题,但仍未解决。 我已经检查过我可能会在Python cli中成功播放相同的场景:

Python 2.7.8 (default, May 15 2016, 12:46:09) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
>>> foo = etree.Element('foo')
>>> foo
<Element foo at 0x7f5097c4fc20>
>>> foo.tag
'foo'
>>> foo.text = 'barrisimo'

>>> xmlb = etree.tostring(foo, pretty_print=True, xml_declaration=True, encoding='UTF-8')
>>> print xmlb
<?xml version='1.0' encoding='UTF-8'?>
<foo>barrisimo</foo>1

有人遇到过同样的问题吗?我已经死路一条,我会感激任何帮助,想法或有用的链接。

3 个答案:

答案 0 :(得分:2)

有同样的问题。

我的测试文件test.py

from lxml import etree


def application(env, start_response):
    foo = etree.Element("foo")
    foo.text = "bar"
    out = etree.tostring(foo)

    print('-------------')
    print(foo)
    print('=============')
    print(out)
    print('-------------')

    if start_response:
        start_response('200 OK', [('Content-Type', 'text/html')])

    return [b"TEST"]


if __name__ == "__main__":
    application(None, None)

在cli模式下运行时:

python test.py

它返回:

-------------
<Element foo at 0x7f5b80671488>
=============
<foo>bar</foo>
-------------

但如果我在wsgi模式下运行,则返回None:

uwsgi --http :9090 --wsgi-file test.py

然后收到

-------------
<Element foo at 0x7f8f84aa7638>
=============

-------------

Pip冻结:

lxml==3.7.2
uWSGI==2.0.14

Lib版本:

libxml used         : (2, 9, 3)
libxml compiled     : (2, 9, 3)
libxslt used        : (1, 1, 29)
libxslt compiled    : (1, 1, 29)

问题的核心原因未知,但问题通过删除包libxml2-dev并重新安装uwsgi来解决:

aptitude remove libxml2-dev
pip uninstall uwsgi
pip install --no-cache-dir uwsgi

所以,以某种方式包libxml2-dev与uwsgi不兼容。

答案 1 :(得分:1)

如果运行时的 libxml 版本与编译版本不同,则表示系统中安装了多个libxml版本:

libxml used         : (2, 7, 8)
libxml compiled     : (2, 9, 3)

在我的情况下mod_php5是问题所在。我通过重新编译没有PHP的apache来解决这个问题。事实证明PHP使用libxml版本2.7.8并且mod_wsgi中使用的python解释器指向相同的xmllib而不是使用python。{/ p>

答案 2 :(得分:0)

CentOS 6和Python 2.7现在已经很老了。因此,我认为最好的解决方案是安装旧版本的lxml:lxml <3.6解决了此问题(例如lxml 3.5.0)。

使用Andrey Kolpakov example,wsgi日志显示:

[Fri Jul 03 14:49:25 2020] [error] -------------
[Fri Jul 03 14:49:25 2020] [error] <Element foo at 0x7faa741cb200>
[Fri Jul 03 14:49:25 2020] [error] =============
[Fri Jul 03 14:49:25 2020] [error] <foo>bar</foo>
[Fri Jul 03 14:49:25 2020] [error] -------------