使用cron启动python脚本在解析XML时失败

2024-10-17 06:26:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在raspberry py上使用python脚本在两个不同的设备上执行domotic。该脚本运行多个任务:

  1. 启动外部命令以获取设备1上串行端口的一些信息
  2. 获取字符串作为响应
  3. 解析结果以生成字典
  4. 启动外部命令,通过设备2上的mbus获取信息
  5. 获取XML字符串作为响应
  6. 分析此字符串
  7. 在初始字典中添加一些信息
  8. 将字典作为post-JSON请求发送到web服务器

如果我手动启动脚本,一切正常

如果我用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 &amp; 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字符串)是否太长? 我是否有办法暂停脚本,以便此函数有足够的时间完成


Tags: 字符串脚本idchildvaluetagunitfunction