Utilizzando SimpleXMLTreeBuilder in elementtree
-
21-08-2019 - |
Domanda
ho sviluppato un'applicazione con Django e elementtree e mentre la distribuzione al server di produzione che ho scoperto è in esecuzione Python 2.4. Sono stato in grado di riunire elementtree ma ora sto ottenendo l'errore:
"No module named expat; use SimpleXMLTreeBuilder instead"
Purtroppo non posso aggiornare python così im bloccati con quello che ho ottenuto. Come si usa SimpleXMLTreeBuilder come il parser e / o avrò bisogno di riscrivere il codice?
Soluzione
Se si dispone di modulo di terze parti che vuole usare ElementTree (e XMLTreeBuilder da dipendenza) è possibile modificare la definizione di XMLTreeBuilder ElementTree a quello fornito da SimpleXMLTreeBuilder in questo modo:
from xml.etree import ElementTree # part of python distribution
from elementtree import SimpleXMLTreeBuilder # part of your codebase
ElementTree.XMLTreeBuilder = SimpleXMLTreeBuilder.TreeBuilder
Ora ElementTree utilizzerà sempre l'SimpleXMLTreeBuilder ogni volta che si chiama.
Si veda anche: http://groups.google.com/group / google-appengine / browse_thread / thread / b7399a91c9525c97
Altri suggerimenti
Ci siamo imbattuti in questo stesso problema utilizzando Python versione 2.6.4 su CentOS 5.5.
Il problema si verifica quando la classe expat tenta di caricare i moduli pyexpat, vedere /usr/lib64/python2.6/xml/parsers/expat.py
Guardando all'interno di /usr/lib64/python2.6/lib-dynload/, non ho visto il "pyexpat.so" oggetto condiviso. Tuttavia, I ha lo vedono su un'altra macchina, che non stava avendo il problema.
Ho confrontato le versioni di Python (yum list 'python *') e identificato che la macchina ben funzionante aveva pitone 2.6.5. Esecuzione 'aggiornamento Python26 yum' risolto il problema per me.
Se questo non funziona per voi e si desidera una soluzione slapstick, è possibile copiare il file in modo nel vostro percorso di carico dinamico.
Supponendo che si sta ora utilizzando elementtree.XMLTreeBuilder
, basta provare questo, invece:
from elementtree import SimpleXMLTreeBuilder as XMLTreeBuilder
Si cerca di fornire esattamente le stesse funzionalità ma utilizzando xmllib invece di expat. Se anche questo non funziona, BTW, provare:
from elementtree import SgmlopXMLTreeBuilder as XMLTreeBuilder
per tentare di utilizzare un'altra applicazione, questa volta sulla base di sgmlop invece.
da elementtree SimpleXMLTreeBuilder importazione come XMLTreeBuilder
Ok, è un po 'cambiato ora:
Traceback (most recent call last):
File "C:\Python26\tests\xml.py", line 12, in <module>
doc = elementtree.ElementTree.parse("foo.xml")
File "C:\Python26\lib\site-packages\elementtree\ElementTree.py", line 908, in parse
tree = parser_api.parse(source)
File "C:\Python26\lib\site-packages\elementtree\ElementTree.py", line 169, in parse
parser = XMLTreeBuilder()
File "C:\Python26\lib\site-packages\elementtree\ElementTree.py", line 1165, in __init__
"No module named expat; use SimpleXMLTreeBuilder instead"
ImportError: No module named expat; use SimpleXMLTreeBuilder instead
Credo che sia stato staticamente collegato con la versione precedente di Python o qualcosa del genere. C'è un modo semplice per collegare parser XML per Python 2.6? Alcune librerie sembrano lavorare solo con le versioni precedenti 8 (
Ho lo stesso errore come quando ho sviluppato su Solaris & python 2.7.2.
Ho risolto questo problema dopo aver installato il pacchetto python expat
utilizzando pkgin.
Vedere se la soluzione di cui sopra può dare qualche idea.