Почему модуль libvirt python останавливает мой скрипт? - PullRequest
0 голосов
/ 02 февраля 2020

Итак, я нахожусь в процессе обучения python с модулем libvirt. Вот небольшой скрипт, который я сделал, который проверяет, успешно ли установлено соединение с libvirtd, и проверяет один домен. Я не разработчик, и я использую несколько ярлыков, поэтому не понимаю, как работает python или модуль libvirt. Но в настоящий момент моя настоящая проблема заключается в том, почему мой скрипт закрывается, если соединение не установлено или домен не найден.

    #!/usr/bin/env python3
    from __future__ import print_function
    import sys
   import libvirt

   domName = 'server1'

   conn = libvirt.open('qemu:///system')
   if conn == None:
        print('Failed to open connection to qemu:///system', file=sys.stderr)
        exit(1)
   else:
        print('Connection opened sucessfully')

   dom = conn.lookupByName(domName)
   if dom == None:
        print('Failed to find the domain '+domName, file=sys.stderr)
        exit(1)
   else:
        print('Domain '+domName+' was found')

   conn.close()
        exit(0)

Например, служба libvirtd остановлена, а соединение не установлено и вместо этого идет дальше по линии в операторе if он просто печатает некоторые ошибки и останавливается, поэтому есть оператор if, который должен это проверить, но в этом случае он не имеет никакой функциональности. Выглядит так:

[root@localhost Documents]# ./virt.py 
libvirt: XML-RPC error : Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory
Traceback (most recent call last):
  File "./virt.py", line 11, in <module>
    conn = libvirt.open('qemu:///system')
  File "/usr/local/lib64/python3.6/site-packages/libvirt.py", line 277, in open
    if ret is None:raise libvirtError('virConnectOpen() failed')
libvirt.libvirtError: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory
[root@localhost Documents]#  

Мне удалось подавить ошибки, но потом это все то же самое, но без ошибок. Также я нашел этот скрипт здесь .

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Я нашел этот скрипт здесь (...)

Итак, вы выучили один первый урок: вы не должны полагаться на код вставки копий, найденный "здесь" (ни в большинстве других мест на самом деле). На самом деле, вы можете считать, что около 80% кода, который вы найдете на net, является дерьмом (и я щедрый).

Я нахожусь в процессе изучения python

Вы делали полностью официальный Python учебник ? Если нет, то это действительно то, с чего вы хотите начать (при условии, что вы уже получили базовые понятия c, такие как типы, переменные, условные выражения, итерации, функции и т. Д. c - иначе вы хотите вместо this )

Например, служба libvirtd остановлена, а соединение не установлено, и вместо этого идет дальше по строкам, если оператор if просто выводит некоторые ошибки и останавливается

Как и большинство современных Языки Python использует механизм, называемый «исключения», чтобы сигнализировать об ошибках. Это гораздо более мощный, удобный и надежный метод, чем возврат кодов ошибок или специальных значений из функций ...

Все это объясняется в руководстве , поэтому я не буду беспокоиться о публикации исправленного кода Простого следования руководству должно быть достаточно, чтобы вы могли самостоятельно исправить этот код.

0 голосов
/ 03 февраля 2020
libvirt.libvirtError: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory

Это сообщение об ошибке указывает на то, что демон libvirtd фактически не работает на этом хосте.

Ваш скрипт все еще нуждается в изменениях, если вы хотите отлавливать ошибки. API-интерфейсы libvirt будут вызывать исключения, когда что-то не так go, поэтому вместо того, чтобы проверять возвращаемое значение с "Нет", вам нужен блок try / исключением, чтобы поймать и обработать его

...