Какова правильная команда pyinstaller, чтобы исполняемый файл pysnmp работал в Windows

Я использую следующее:

  • пснмп 4.4.9
  • Питон 3.7.2
  • программа установки 3.4

Мой код очень прост, суть его ниже:

def snmpv2Get(ip_address):
    errorIndication, errorStatus, errorIndex, varBinds = next(
        getCmd(SnmpEngine(),
               CommunityData(snmpv2Community),
               UdpTransportTarget([ip_address, 161]),
               ContextData(),
               ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0')),
               ObjectType(ObjectIdentity('1.3.6.1.2.1.1.2.0')),
               lookupMib=False)
    )

При преобразовании кода в исполняемый файл с помощью pyinstaller я получаю эту ошибку при попытке запустить сгенерированный исполняемый файл:

pysnmp.smi.error.MibNotFoundError: No module __SNMP-FRAMEWORK-MIB loaded at <pysnmp.smi.builder.MibBuilder object at 0x000002788101EA20>

Команда, которую я использую для pyinstaller, выглядит следующим образом:

pyinstaller -y -F -i "icon.ico" SNMP.py --hidden-import="pysnmp.smi.mibs,pysnmp.smi.mibs.instances,pysnmp.smi.exval,pysnmp.cache"

Честно говоря, я не хочу изменять файл *.spec, потому что каждый раз, когда я его изменяю, команда переопределяет содержимое *.spec, не знаю почему.

Пожалуйста, какова правильная командная строка, чтобы избежать этой ошибки «Нет модуля». Я видел много потоков с подобным сообщением об ошибке, но все они имели дело с файлом *.spec, и я ищу правильную командную строку для использования в Windows, а не файл *.spec.


person elekgeek    schedule 26.03.2019    source источник


Ответы (2)


Похоже, что PyInstaller не может разрешить pysnmp самостоятельно, поэтому простым решением является использование Tree и внедрение каталога библиотеки в исполняемый файл. После создания файла spec добавьте класс Tree. Таким образом, ваш файл спецификации должен выглядеть примерно так (не забудьте заменить путь модуля в соответствии с вашим путем Python):

# -*- mode: python -*-

block_cipher = None


a = Analysis(
    ...
)
a.datas += Tree("./env/Lib/site-packages/pysnmp", prefix='pysnmp')
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
...

И, наконец, сгенерируйте свой исполняемый файл с помощью (я предлагаю вам не использовать имя вашего скрипта так же, как имя модуля):

pyinstaller script.spec
person Masoud Rahimi    schedule 13.07.2019

Вот содержимое моего файла *.spec, он очень хорошо работает для pysnmp и pyinstaller:

# -*- mode: python -*-
# source: http://qaru.site/questions/8036799/pyinstaller-does-not-work-when-including-pysnmp

from PyInstaller.utils.hooks import collect_data_files, collect_submodules

x = Tree('C:/Python37/Lib/site-packages/pysnmp/smi/mibs',prefix='pysnmp/smi/mibs',excludes='.py')

block_cipher = None


a = Analysis(['SNMP.py'],
             pathex=['path to python file/'],
             binaries=[],
             datas=[],
             hiddenimports=['pysnmp.smi.exval','pysnmp.cache'] + collect_submodules('pysnmp.smi.mibs') + collect_submodules('pysnmp.smi.mibs.instances'),
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          x,
          name='SNMP',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True , icon='icon.ico')
person elekgeek    schedule 14.07.2019