没有名为pcapy pyinstaller的模块

时间:2015-08-04 19:52:58

标签: python pcap pyinstaller scapy

这是我第一次使用pyinstaller,在构建可执行文件并尝试运行可执行文件后,我得到ImportError: No module named pcapy。有人能告诉我为什么模块可能会丢失吗?不确定它是否有帮助,但我的脚本是1个文件,这里是我的所有导入:

from tornado.websocket import WebSocketHandler
from tornado.httpserver import HTTPServer
from tornado.web import Application
from tornado.ioloop import IOLoop

import subprocess
import threading
import os

import sys
from scapy.all import *
import logging

我正在运行OS X 10.10.5,scapy 2.3.1和python 2.7.9

2 个答案:

答案 0 :(得分:0)

使用以下内容创建名为hook-pcap.py的文件:

import os
import glob
import itertools

try:
    # PY_EXTENSION_SUFFIXES is unavailable in older versions
    from PyInstaller.hooks.hookutils import PY_EXTENSION_SUFFIXES
except ImportError:
    try:
        from importlib.machinery import EXTENSION_SUFFIXES as PY_EXTENSION_SUFFIXES
    except ImportError:
        import imp
        PY_EXTENSION_SUFFIXES = set([f[0] for f in imp.get_suffixes()
                                     if f[2] == imp.C_EXTENSION])

def hook(mod):
    module_directory = os.path.dirname(mod.__file__)
    bundled = []

    for libname, ext in itertools.product(('pcap', ),
                                          PY_EXTENSION_SUFFIXES):
        bundled.extend(glob.glob(os.path.join(module_directory, libname + ext)))

    for f in bundled:
        name = os.path.join('pcap', os.path.basename(f))
        if hasattr(mod, 'pyinstaller_binaries'):
            mod.pyinstaller_binaries.append((name, f, 'BINARY'))
        else: # mod.pyinstaller_binaries is unavailable in older versions
            mod.binaries.append((name, f, 'BINARY'))

    return mod

使用hook-dnet.py重复此过程:

import os
import glob
import itertools

try:
    # PY_EXTENSION_SUFFIXES is unavailable in older versions
    from PyInstaller.hooks.hookutils import PY_EXTENSION_SUFFIXES
except ImportError:
    try:
        from importlib.machinery import EXTENSION_SUFFIXES as PY_EXTENSION_SUFFIXES
    except ImportError:
        import imp
        PY_EXTENSION_SUFFIXES = set([f[0] for f in imp.get_suffixes()
                                     if f[2] == imp.C_EXTENSION])

def hook(mod):
    module_directory = os.path.dirname(mod.__file__)
    bundled = []

    for libname, ext in itertools.product(('dnet', ),
                                          PY_EXTENSION_SUFFIXES):
        bundled.extend(glob.glob(os.path.join(module_directory, libname + ext)))

    for f in bundled:
        name = os.path.join('dnet', os.path.basename(f))
        if hasattr(mod, 'pyinstaller_binaries'):
            mod.pyinstaller_binaries.append((name, f, 'BINARY'))
        else: # mod.pyinstaller_binaries is unavailable in older versions
            mod.binaries.append((name, f, 'BINARY'))

    return mod

构建时,将pcapdnet指定为隐藏导入,并提供将挂钩文件作为值放入--additional-hooks-dir参数的目录的路径,如下所示:

--hidden-import=pcap --hidden-import=dnet --additional-hooks-dir=<path_to_directory_of_hook_files>

答案 1 :(得分:0)

当我想使用pyinstaller将直接使用pcapy模块的python脚本转换为可执行文件时,我也遇到了这个问题。以下是我的解决方案。

输入python模块目录,其中是Windows中的Lib / site-packages。我发现pcapy模块作为单个文件存在,名为&#39; pcapy-0.10.9-py2.7-win-amd64.egg&#39;。我认为它可能是一些压缩技术,并且pyinstaller无法分析此压缩文件。所以我提取了&#39; pcapy-0.10.9-py2.7-win-amd64.egg&#39;,并删除原来的&#39; pcapy-0.10.9-py2.7-win-amd64.egg& #39;文件,将解压缩的目录重命名为&#39; pcapy-0.10.9-py2.7-win-amd64.egg&#39;。

然后,我再次转换了脚本,这次,可执行文件工作正常,没有任何导入错误。