2016-12-09 16 views
3

私のサーバーはApache2 + WSGI上に構築されたCentOS 6.8でPython 2.7.8を使用しています。私のアプリケーションでは、http POSTで受け取った日付を処理し、ローカル.xmlファイルから取得したXMLテンプレートに基づいて命令を作成する必要があります。最後に、xml命令を200 OK応答で送り返す必要があります。アプリケーションのロジックは、[OK]を作業と私は私の更新されたXMLツリーを見ることができるようです。Python lxml etree.tostring()はmod_wsgiで空の文字列を返します

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') 

印刷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に似ています。同様の問題を含むもう1つの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

'mod_wsgi'の' tostring() 'には問題があるようですが、それでも解決策はありません。 – furas

+1

コードスニペットを実際の内容に修正できますか?それは有効なPythonでさえありません。 '' xml_body = print etree.tostring(...) ''のように '' print''を使った結果を変数に代入することはできません。 –

+0

lxmlが元々コンパイルされていたものより古いバージョンのlibxmlとlibxsltを使用していることについて、リンク先のアドバイスに耳を傾けましたか?あなたのケースは、そのシナリオとまったく同じように見え、前述のように問題を引き起こす可能性があります。ライブラリのシステムパッケージをアップグレードしたことを確認しましたか? –

答えて

1

同じ問題があります。

私のテストファイルtest.py

CLIモードで実行
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) 

python test.py 

それが返されます:私はWSGIモードで実行する場合

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

しかし、それはNoneを返します:

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

lxml==3.7.2 
uWSGI==2.0.14 

Libのバージョン:

その後

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

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

ピップ凍結受信問題の

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

実行時にlibxmlバージョンがコンパイルされたバージョンと異なっている場合、それはあなたのシステムにインストールされている複数のlibxmlバージョンがあることを意味:私の場合mod_php5

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

が問題でした。 PHPなしでApacheを再コンパイルすることでこれを修正しました。 PHPがlibxmlバージョン2.7.8を使用していたことが判明し、mod_wsgiで使用されていたPythonインタプリタは、pythonの代わりに同じxmllibを指していました。

関連する問題