我尝试在raspberry py上使用python脚本在两个不同的设备上执行domotic。该脚本运行多个任务:
如果我手动启动脚本,一切正常
如果我用cron启动脚本,脚本将冻结对来自设备2的XML字符串的解析
python /home/<user>/script/dom.py
如果我删除设备2解析(步骤6&;7) ,cron运行良好
我曾经尝试过用DOM和SAX的方式解析字符串,在解析阶段也是如此
XML字符串大约有80行长
XML解析过程是否太慢?我怎样才能解决这个问题? 我真的想避免写入文件,因为重写对SD卡没有好处。。。 谢谢
以下是冻结功能:
nv = {}
id =''
def pw3_parseDOM( XMLstr):
tree = ET.ElementTree(ET.fromstring(XMLstr))
root = tree.getroot()
root.tag
root.attrib
for child in root:
if (child.tag == CONST_XML_DATARECORD):
Val = ''
Nam = ''
for value in child:
if value.tag == CONST_XML_VALUE:
Val = value.text
elif value.tag == CONST_XML_UNIT:
Nam = Shortcut.get(value.text, 'None')
if(Nam == 'pw3_temp_in' or Nam == 'pw3_temp_out'):
nv[Nam] = str(Val).decode('utf-8')
elif(Nam == 'pw3_temp_delta'):
nv[Nam] = str(Val).decode('utf-8')
elif (child.tag == CONST_XML_INFO):
for c in child:
if(c.tag == CONST_XML_ID):
id = c.text
以及传递给pw3_parseDOM()的典型xml字符串:
<MBusData>
<SlaveInformation>
<Id>13745998</Id>
<Manufacturer>ITR</Manufacturer>
<Version>24</Version>
<ProductName></ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>39</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<Unit>Fabrication number</Unit>
<Value>13745998</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<Unit>Energy (kWh)</Unit>
<Value>29052</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<Unit>Volume (1e-2 m^3)</Unit>
<Value>349893</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<Unit>Power (100 W)</Unit>
<Value>0</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>0</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<Unit>Flow temperature (1e-1 deg C)</Unit>
<Value>260</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<Unit>Return temperature (1e-1 deg C)</Unit>
<Value>235</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<Unit>Temperature Difference (1e-2 deg C)</Unit>
<Value>256</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<Unit>Time Point (time & date)</Unit>
<Value>2018-02-02T22:48:00</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<Unit>Operating time (days)</Unit>
<Value>1647</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<Unit>Firmware version</Unit>
<Value>7</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<Unit>Software version</Unit>
<Value>8</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<Unit>Volume (1e-1 m^3)</Unit>
<Value>0</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<Unit>Volume (1e-1 m^3)</Unit>
<Value>0</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
<DataRecord id="14">
<Function>Manufacturer specific</Function>
<Value>00 00</Value>
<Timestamp>2018-02-02T20:43:39</Timestamp>
</DataRecord>
</MBusData>
PS:就我所能做的,我被绊倒了:
xml.etree.ElementTree.fromString
那么,作为参数传递的sring(上面的XML字符串)是否太长? 我是否有办法暂停脚本,以便此函数有足够的时间完成
目前没有回答
相关问题 更多 >
编程相关推荐