这是我第一次使用pyinstaller,在我构建了我的可执行文件并尝试运行我的可执行文件之后,我得到了ImportError: No module named pcapy。有人能告诉我为什么模块会丢失吗?我不确定它是否有帮助,但我的脚本是一个文件,下面是我所有的导入:
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
发布于 2015-08-06 01:02:44
创建一个名为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在构建时,将pcap和dnet指定为隐藏导入,并将放置挂钩文件的目录的路径作为--additional-hooks-dir参数的值提供,如下所示:
--hidden-import=pcap --hidden-import=dnet --additional-hooks-dir=<path_to_directory_of_hook_files>发布于 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’。
然后,我再次转换脚本,这一次,可执行文件工作正常,没有任何导入错误。
https://stackoverflow.com/questions/31818078
复制相似问题