0

Brython 関連のテスト用の小さなテスト ページがあり、最近そこに xml.etree.Elementree モジュールを追加しましたが、何らかの理由で機能しません。

私は次のコードを実行しました(実際にはもっと多くのものがありますが、無関係な部分を削除しました):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" type="text/css" href="/js/jquery-ui-1.12.1/jquery-ui.min.css" media="screen" />
<link rel="stylesheet" type="text/css" href="/js/jquery-ui-1.12.1/jquery-ui.structure.min.css" media="screen" />
<link rel="stylesheet" type="text/css" href="/layout.css" media="screen" />
<link rel="stylesheet" type="text/css" href="/visual.css" media="screen" />
<link rel="stylesheet" type="text/css" href="/js/jquery-ui-1.12.1/jquery-ui.theme.min.css" media="screen" />
<script rel="script" type="text/javascript" src="/js/jquery-3.1.1.min.js"></script>
<script rel="script" type="text/javascript" src="/js/jquery-ui-1.12.1/jquery-ui.min.js"></script>
<script rel="script" type="text/javascript" src="/js/brython/brython.js"></script>
<script rel="script" type="text/javascript" src="/js/brython/brython_stdlib.js"></script>
</head>

<body onload='brython()'>
    <script type="text/python" charset="utf-8">
    import sys
    from browser import alert, document as docu
    from browser import ajax
    from xml.etree import ElementTree as ET

    def ajaxReceive(req):
        alert("Input value: " + docu["numinput"].value)
        alert('Ajax response: \n %s' % req.text )
        if req.status == 200 or req.status == 0:
            d = docu['messagebox']
            d.clear()

            r = ET.fromstring(req.text)
            #n = r.findall('./person/name')
            #a = r.findall('./person/age')
            #d.text = 'Dude %s is %s old.' % (n,a)
        else:
            docu['messagebox'] <= 'error: ' + req.text

    def ajaxSend():
        req = ajax.ajax()
        url = '/bryt/'
        x = 1
        y = 2
        z = docu['numinput']

        req.open('POST', url, True)
        req.bind('complete', ajaxReceive)
        req.set_header('content-type', 'application/x-www-form-urlencoded' )
        req.send( {
            'action': 'calc',
            'x': x, 
            'y': y,
            'z': z.value
        })

    docu['ajaxbutton'].bind('click', ajaxSend )

    d = docu['messagebox']
    d.clear()
    d.text = 'ready'
    </script>

    <div id='messagebox' style='width: 20%; border: 1px solid gray; padding: 2em;' >
    </div>
    <br/>

    <input id="numinput" / >
    <br/>
    <br/>
    <button id='ajaxbutton' >Ajax run</button>
</body>
</html>

サーバー側では、指定された数に3を加算するだけです。問題は、受信されている XML 形式の Ajax 応答です。これは明確な XML で提供されますが、.fromstring() 関数を呼び出して etree ルート要素を構築しても、次のようにトレースバックします。

Error 500 means that Python module pyexpat was not found at url http://example.com/bryt/pyexpat.py
brython.js:7171:1
Error 500 means that Python module pyexpat was not found at url http://example.com/bryt/pyexpat/__init__.py
brython.js:7171:1
Error 500 means that Python module pyexpat was not found at url http://example.com/js/brython/Lib/site-packages/pyexpat.py
brython.js:7171:1
Error 500 means that Python module pyexpat was not found at url http://example.com/js/brython/Lib/site-packages/pyexpat/__init__.py
brython.js:7171:1
Error for module xml.parsers.expat
brython.js:7242:21


Error: 
Stack trace:
_b_.ImportError.$factory@http://example.com/js/brython/brython.js line 6466 > eval:49:371
import_hooks@http://example.com/js/brython/brython.js:11605:7
$B.$__import__@http://example.com/js/brython/brython.js:7430:33
$B.$import@http://example.com/js/brython/brython.js:7460:43
$module<@http://example.com/js/brython/brython.js line 7242 > eval:14:9
@http://example.com/js/brython/brython.js line 7242 > eval:1:16
run_py@http://example.com/js/brython/brython.js:7242:1
exec_module@http://example.com/js/brython/brython.js:7276:1
cl_method@http://example.com/js/brython/brython.js:4729:43
import_hooks@http://example.com/js/brython/brython.js:11629:5
$B.$__import__@http://example.com/js/brython/brython.js:7430:33
$B.$import@http://example.com/js/brython/brython.js:7473:5
__init__205@http://example.com/js/brython/brython.js line 7242 > eval:5653:25
type.__call__@http://example.com/js/brython/brython.js:4674:20
factory@http://example.com/js/brython/brython.js:4741:47
XML194@http://example.com/js/brython/brython.js line 7242 > eval:5190:41
ajaxReceive3@http://example.com/js/brython/brython.js line 4294 > eval:176:32
@http://example.com/js/brython/brython.js line 7188 > eval:69:24
ajax.$factory/xmlhttp.onreadystatechange@http://example.com/js/brython/brython.js line 7188 > eval:161:13
brython.js:7243:1
16:21:17.002 args 
Array [ "No module named pyexpat" ]

また、過去のbrython issue 613にも同様のことがありました。Pierreは、純粋な python pyexpat (2017 年 7 月)などは存在しない と述べています。しかし、Brython の標準配布リストには Lib/xml/etree と expat.py がありますが、これはまだ利用できないということですか?

Brython Lib/xml/etreeElementTree.pyの 1511 行目以降は次で始まります。

class XMLParser:

    def __init__(self, html=0, target=None, encoding=None):
        try:
            from xml.parsers import expat
        except ImportError:
            try:
                import pyexpat as expat
            except ImportError:
                raise ImportError(
                    "No module named expat; use SimpleXMLTreeBuilder instead"
                    )

私の理解では、xml.parsers import expat からの最初のインポートでは成功するはずですが、存在しないバージョンを pyexpat しようとすると成功しないようです。

それで、問題は、他の誰かが同じ問題に遭遇したか、および/または誰かがこれに対する解決策を持っているかということです?


いくつかの追加 (翌日) の観察:

tagのクローン作成とチェックアウト、git リポジトリからのビルドは、実際には期待どおりに機能しません (しゃれた意図はありません)。

% git clone https://github.com/brython-dev/brython.git brython.git
% cd brython.git/scripts
brython.git/scripts% python3 ./make_dist.py 
/usr/bin
Traceback (most recent call last):
  File "./make_dist.py", line 207, in <module>
    run()
  File "./make_dist.py", line 88, in run
    import make_stdlib_list
  File "brython.git/scripts/make_stdlib_list.py", line 53, in <module>
    with open(os.path.join(static_doc_folder,lang,'stdlib.html'), 'w', encoding="utf-8") as out:
FileNotFoundError: [Errno 2] No such file or directory: 'brython.git/www/static_doc/en/stdlib.html'
brython.git% 

これは、ディレクトリが見つからないことが原因です。

brython.git/scripts% mkdir -p  ../www/static_doc/{en,es,fr}

brython.git/scripts% python3 ./make_dist.py

最後のビルド行は次のとおりです。

adding xml.etree
adding xml.etree.cElementTree
adding xml.parsers
adding xml.parsers.expat
adding xml.sax

したがって、それらが含まれている可能性があります。

ターゲットが作成されると、(どうやら、よくわからない) brython.git/setup/dataディレクトリに表示され、ライブ Web サイト用の zip ファイルとネイキッド .js ファイルがリリースされます。そこで、Apache httpd webroot のそのディレクトリにリンクします。しかし、その建物はトレースバックの問題を解決しませんでした。

余談ですが、私のような古い OpenSource のおならの場合、このソース ツリーは非常に異質に感じます。このプロジェクトはMouse camp (Microsoft Windows) で行われ、1 つのまれな Makefile でさえ見つけられましたが、競合するため GNU Make では動作しません。空白の使用。言うまでもなく、通常の INSTALL、README、セットアップ、Makefile などの期待される内容のファイルがあります。私は文字通りソースを読んで、これがどのように機能するのかを推測しています。しかし、それは Python が本当にクロスプラットフォーム言語であることを示しているだけだと思います。

「オープン ソース プロジェクト」であるため、その議論が万人向けではないのはおかしいです: Google グループ brythonへの参加申請は拒否されました

4

2 に答える 2

0

さて、さらに掘り下げてみると、Lib/xml/parses/expat.pyには以下が含まれているようです。

"""Interface to the Expat non-validating XML parser."""
import sys

from pyexpat import *

# provide pyexpat submodules as xml.parsers.expat submodules
sys.modules['xml.parsers.expat.model'] = model
sys.modules['xml.parsers.expat.errors'] = errors

その pyexpat 部分にコメントして、pkgs を再構築しようとしましたが、トレースバックが異なります。そのため、expat も pyexpat も ElementTree もありません。その場合、Ajax 応答に XML はありません。

于 2018-03-21T13:58:22.910 に答える