使pysnmp可执行文件在Windows上工作的正确pyinstaller命令是什么

时间:2019-03-26 14:20:18

标签: python-3.x pyinstaller pysnmp

我正在使用以下内容:

  • pysnmp 4.4.9
  • Python 3.7.2
  • pyinstaller 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文件。

2 个答案:

答案 0 :(得分:0)

PyInstaller似乎无法自行解决pysnmp,因此一个简单的解决方案是使用Tree类并将库目录嵌入可执行文件中。生成spec文件后,添加Tree类。因此,您的spec文件应该看起来像这样(切记要根据您的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

答案 1 :(得分:0)

这是我的* .spec文件的内容,对于pysnmp和pyinstaller来说效果很好:

ember-auto-import