我在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
有人遇到过同样的问题吗?我已经死路一条,我会感激任何帮助,想法或有用的链接。
答案 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] -------------