pysnmp.smi.error.MibNotFoundError: модуль __SNMP-FRAMEWORK-MIB не загружен в объект ‹pysnmp.smi.builder.MibBuilder по адресу 0x0418A110›

Я только начинаю изучать Python, поэтому, пожалуйста, поддержите меня. Я пытался найти решение этой ошибки в течение последних 3 дней в Google, Stack Overflow, Github, python.org, а также snmplabs.com. Я перешел от других ошибок (отчасти благодаря вышеуказанным веб-сайтам), но эта поставила меня в тупик, и я не могу ее решить.

Я использую следующие версии: Windows 10 Enterprise, 64-разрядная версия Python 3.6, pysnmp 4.4.4, pyasn1 0.2.3, и я использую paramiko для ssh и tkinter в качестве графического интерфейса. Мой проект составлен с использованием Visual Studio Code v1. 20.1

По сути, я сделал приложение python, которое входит в коммутатор cisco и добавляет vlan в магистраль, заменяет его другим vlan или удаляет оба vlan.

Каждый раз, когда производится одно из этих изменений vlan, сценарий отправляет ловушку snmp в NMS, сообщая о том, что только что было сделано. Ловушка — это просто OID следующим образом:

def sendTrap(system):
debug.setLogger(debug.Debug('msgproc'))

next(sendNotification(SnmpEngine(),
CommunityData('blahblah'),
UdpTransportTarget(('1.1.1.1', 162)),
ContextData(),
'trap',
# sequence of custom OID-value pairs
[ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'), OctetString(system))]))

Также происходят некоторые другие вещи, такие как цвет фона при внесении изменений, и начинается таймер, который сбрасывает все обратно через заданное количество времени.

Программа работает безупречно, когда я запускаю ее как скрипт Python.

Однако, когда я использую cx_freeze для создания исполняемого файла моего маленького приложения, все работает, КРОМЕ ловушки snmp, и в настоящее время я получаю следующую ошибку трассировки:

    2018-02-17 02:17:39,956 pysnmp: running pysnmp version 4.4.4
    2018-02-17 02:17:39,957 pysnmp: debug category 'msgproc' enabled
    Exception in Tkinter callback
    Traceback (most recent call last):

      File "C:\Python\Python36-32\lib\site-packages\pysnmp\entity\engine.py", line 91, in __init__
        '__SNMP-FRAMEWORK-MIB', 'snmpEngineMaxMessageSize')
      File "C:\Python\Python36-32\lib\site-packages\pysnmp\smi\builder.py", line 409, in importSymbols
        'No module %s loaded at %s' % (modName, self)
    pysnmp.smi.error.MibNotFoundError: No module __SNMP-FRAMEWORK-MIB loaded at pysnmp.smi.builder.MibBuilder object at 0x034C9150

Модуль __SNMP-FRAMEWORK-MIB расположен в C:\Python\Python36-32\Lib\site-packages\pysnmp\smi\mibs\instances, и я включил эту папку в установочный файл следующим образом (теперь ЭТО, где я думаю, что ошибся):

    options = {
'build_exe': {
    #'packages':packages,
    'include_files':[
        os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
        os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
        'C:\\Python\\Python36-32\\Lib\\site-packages\\idna',
        'C:\\Python\\Python36-32\\Lib\\site-packages\\pysnmp\\smi\\mibs',
        'C:\\Python\\Python36-32\\Lib\\site-packages\\pysnmp\\smi\\mibs\\instances'
     ],
},
    }

* Пожалуйста, не обращайте внимания на странные отступы, так как я пытался получить правильный формат для представления его здесь.

Извините, но, хотя я много читал об этом за последние несколько дней, я не совсем разбираюсь в таких вещах, как пакеты, модули, опции и включения, поэтому все это немного чуждо мне.

Если кто-то может увидеть, где я ошибаюсь, или если мне нужно предоставить дополнительную информацию, пожалуйста, дайте мне знать. Любая помощь будет высоко оценена. Спасибо


person Terry    schedule 17.02.2018    source источник
comment
Такое ощущение, что файл __SNMP-FRAMEWORK-MIB.py (как и другие в каталоге instances) не был включен в ваш файл .exe. Если это так, это относится к инструменту cx-freeze, поэтому вам, вероятно, следует спросить там. Имейте в виду, что pysnmp явно не импортирует эти файлы, а загружает их во время выполнения.   -  person Ilya Etingof    schedule 17.02.2018
comment
Спасибо, Илья. Вы предлагаете мне перенаправить этот вопрос на форум cx_freeze? Поскольку pysnmp загружает файлы во время выполнения, будет ли это работать, если я скопирую содержимое папки instances в тот же каталог, что и файл .exe? Спасибо еще раз.   -  person Terry    schedule 18.02.2018
comment
Мне удалось найти биты в cx_freeze, где он, кажется, копирует файлы: копирование C:\Python\Python36-32\Lib\site-packages\pysnmp\smi\mibs\instances_init_. py -> build\exe.win32-3.6\mibs\instances_init_.py копирование C:\Python\Python36-32\Lib\site-packages\pysnmp\smi\mibs\instances__PYSNMP-USM- MIB.py -> build\exe.win32-3.6\mibs\instances__PYSNMP-USM-MIB.py копирует C:\Python\Python36-32\Lib\site-packages\pysnmp\smi\mibs\instances__SNMP-FRAMEWORK-MIB. py -> build\exe.win32-3.6\mibs\instances__SNMP-FRAMEWORK-MIB.py', поэтому я до сих пор не уверен, что происходит не так...   -  person Terry    schedule 18.02.2018
comment
Я также разместил это на python-forum.io, поэтому, если проблема будет решена, я тоже посоветую здесь . Ваше здоровье   -  person Terry    schedule 18.02.2018


Ответы (1)


С большой помощью snippsat на python-forum я, наконец, заставил это работать. По сути, cx_freeze не будет работать хорошо, поэтому мы в итоге использовали pyinstaller с небольшой настройкой файла «spec» (Как подробно описано на форуме python), и теперь все работает.

person Terry    schedule 19.02.2018