2016-09-16 5 views
0

Я использую модули python lxml и psutil для записи некоторых системных показателей, которые должны быть помещены в файл XML и скопированы на удаленный сервер для анализа по php и отображены на пользователь.Python с использованием lxml для записи xml-файла с данными о производительности системы

Однако, lxml дает мне некоторые проблемы с нажатием некоторых переменных, объектов и т. Д. На различные части моего XML.

Например:

import psutil, os, time, sys, platform 
from lxml import etree 

# This creates <metrics> 
root = etree.Element('metrics') 

# and <basic>, to display basic information about the server 
child1 = etree.SubElement(root, 'basic') 

# First system/hostname, so we know what machine this is 
etree.SubElement(child1, "name").text = socket.gethostname() 

# Then boot time, to get the time the system was booted. 
etree.SubElement(child1, "boottime").text = psutil.boot_time() 

# and process count, see how many processes are running. 
etree.SubElement(child1, "proccount").text = len(psutil.pids()) 

Линия, чтобы получить имя хоста системы работы.

Однако следующие две строки, чтобы получить время загрузки и ошибок подсчета процесс выхода, с:

>>> etree.SubElement(child1, "boottime").text = psutil.boot_time() 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "lxml.etree.pyx", line 921, in lxml.etree._Element.text.__set__ (src/lxml/lxml.etree.c:41344) 
File "apihelpers.pxi", line 660, in lxml.etree._setNodeText (src/lxml/lxml.etree.c:18894) 
File "apihelpers.pxi", line 1333, in lxml.etree._utf8 (src/lxml/lxml.etree.c:24601) 
TypeError: Argument must be bytes or unicode, got 'float' 
>>> etree.SubElement(child1, "proccount").text = len(psutil.pids()) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "lxml.etree.pyx", line 921, in lxml.etree._Element.text.__set__ (src/lxml/lxml.etree.c:41344) 
File "apihelpers.pxi", line 660, in lxml.etree._setNodeText (src/lxml/lxml.etree.c:18894) 
File "apihelpers.pxi", line 1333, in lxml.etree._utf8 (src/lxml/lxml.etree.c:24601) 
TypeError: Argument must be bytes or unicode, got 'int' 

Итак, вот что мой XML выглядит как напечатано:

>>> print(etree.tostring(root, pretty_print=True)) 
<metrics> 
    <basic> 
    <name>mercury</name> 
    <boottime/> 
    <proccount/> 
    </basic> 
</metrics> 

Итак, есть в любом случае, чтобы нажимать float и ints на xml-текст, как мне нужно? Или я делаю это совершенно неправильно?

Спасибо за любую помощь, которую вы можете предоставить.

ответ

2

text поля, как ожидается, будет Юникод или ул, а не какой-либо другой типа (boot_time является float и len() это целый). Так просто преобразовать в строку в нестроковые совместимые элементы:

# First system/hostname, so we know what machine this is 
etree.SubElement(child1, "name").text = socket.gethostname() # nothing to do 

# Then boot time, to get the time the system was booted. 
etree.SubElement(child1, "boottime").text = str(psutil.boot_time()) 

# and process count, see how many processes are running. 
etree.SubElement(child1, "proccount").text = str(len(psutil.pids())) 

результат:

b'<metrics>\n <basic>\n <name>JOTD64</name>\n <boottime>1473903558.0</boottime>\n <proccount>121</proccount>\n </basic>\n</metrics>\n' 

Я полагаю, что библиотека может сделать isinstance(str,x) тест или str преобразование, но он не был разработан таким образом (что, если вы хотите отображать свои поплавки с ведущими нулями, усеченными десятичными знаками ...). Он работает быстрее, если lib предполагает, что все равно str, что в большинстве случаев.

+0

Ну ... Я был способ переоценить ситуацию. Спасибо, что ответили на мою некомпетентность! cookie для вас, сэр. – Jguy

 Смежные вопросы

  • Нет связанных вопросов^_^