这是我第一次使用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
答案 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
构建时,将pcap
和dnet
指定为隐藏导入,并提供将挂钩文件作为值放入--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;。
然后,我再次转换了脚本,这次,可执行文件工作正常,没有任何导入错误。