首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有名为pcapy pyinstaller的模块

没有名为pcapy pyinstaller的模块
EN

Stack Overflow用户
提问于 2015-08-05 03:52:58
回答 2查看 1.5K关注 0票数 0

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

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2015-08-06 01:02:44

创建一个名为hook-pcap.py的文件,其中包含以下内容:

代码语言:javascript
复制
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重复此过程

代码语言:javascript
复制
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参数的值提供,如下所示:

代码语言:javascript
复制
--hidden-import=pcap --hidden-import=dnet --additional-hooks-dir=<path_to_directory_of_hook_files>
票数 0
EN

Stack Overflow用户

发布于 2015-12-19 23:46:54

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

进入python模块目录,其中在Windows中是Lib/site-package。我发现pcapy模块作为一个单独的文件存在,命名为'pcapy-0.10.9-py2.7-win-amd64.egg‘。我想这可能是某种压缩技术,而pyinstaller在那段时间内无法分析这个压缩文件。所以我解压了'pcapy-0.10.9-py2.7-win-amd64.egg',删除了原来的'pcapy-0.10.9-py2.7-win-amd64.egg‘文件,将解压后的目录重命名为'pcapy-0.10.9-py2.7-win-amd64.egg’。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31818078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档