Python: xml eredmény fájlba írása

0 votes
asked Apr 7, 2015 in IRF tantárgy by bds (22 points)  

A feladatom: Python3 szkript WS-Management segítségével lekérdezni a Windows szolgáltatásokat.

A lekérést subprocess.call(["wsman",...])-al próbáltam megoldani, ami ki is írja a kimenetre a szolgáltatásokat xml formátumban.
Találtam egy xml.etree.ElementTree.parse függvényt, ami be tud olvasni és át tud alakítani xml-t, de csak fájlból.

Hogyan írhatnám ki az eredményt fájlba, hogy aztán a függvénnyel beolvashassam?

f=open('temp','w')
f.write(ET.parse(subprocess.call(["wsman",...])))
f.close()

Ebben az esetben egyetlen nullás karakter jelentik meg a fájlban. Mit rontok el? Mit kéne másképp csinálni?

1 Answer

+1 vote
answered Apr 7, 2015 by kovari (2,221 points)  
edited Apr 7, 2015 by kovari

Próbáld a subprocess.check_output függvényt használni, és akkor vissza kapod a kimenetet, így nem is kell külön fájlba írnod. Az ElementTree használata jó ötlet, de nem feltétlenül csak fájlból lehet beolvasni hozzá xml-t.

Ajánlom a következő oldalt, bár valószínűleg már meg is találtad: elementtree

Amúgy azért jelent meg csak egy nulla a kimenetben, mert a call függvény a futtatott parancs visszatérési kódját adja csak vissza, és a nulla ugye a sikeres lefutást reprezentálja.

Edit:
Bocsánat, javítva. Szóval a parse lehet, hogy tényleg csak fájlból való xml-ek olvasására képes, de mindenképp használható helyette más megoldás is, lásd a linkelt oldalon lévő függvényeket.

commented Apr 8, 2015 by maxiking (28 points)  
Néztem ezt az elementtree-t, az ET.fromstring() metódus való arra hogy beolvasson egy stringből. Viszont a wsman nem egy xml fájlt ad vissza, hanem sokat, ezért az elementtree nem tudja feldolgozni. Legalábbis én erre gyanakszom, mert hibát dob: "xml.etree.ElementTree.ParseError: junk after document element: line 15, column 0"
Próbáltam keresgélni itt és valami lxml-t írtak megoldásként, viszont azt külön telepíteni kell. Mit tegyek?
commented Apr 8, 2015 by kovari (2,221 points)  
Hirtelen ötlet: darabold fel a stringet az első tag mentén, ami biztos, hogy minden xml-ben csak egyszer szerepel. Egy egyszerű split() függvénnyel ez sikerülhet is. Csak arra kell még figyelni, hogy a szeparátort (ami mentén darabolsz) írd vissza az egyes xml struktúrák elejére, mert amúgy nem lenne valid.
...