首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyinstaller:构建可执行文件后找不到_libcouchbase模块

pyinstaller:构建可执行文件后找不到_libcouchbase模块
EN

Stack Overflow用户
提问于 2015-06-15 13:32:43
回答 1查看 796关注 0票数 1

我有一个简单的python脚本,它在Ubuntu14.04上导入couchbase模块:

代码语言:javascript
复制
$ cat test.py
from couchbase import Couchbase

print 'module _libcouchbase found'

从解释器运行很好:

代码语言:javascript
复制
$ python test.py
module _libcouchbase found

创建可执行文件:

代码语言:javascript
复制
$ pyinstaller test.py

运行可执行文件会引发无法导入_libcouchbase模块的错误:

代码语言:javascript
复制
$ ./dist/test/test
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/subba/cb/build/cb/out00-PYZ.pyz/mycouch", line 28, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/subba/cb/build/cb/out00-PYZ.pyz/couchbase", line 28, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/subba/cb/build/cb/out00-PYZ.pyz/couchbase.user_constants", line 21, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/subba/cb/build/cb/out00-PYZ.pyz/couchbase._bootstrap", line 34, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/subba/cb/build/cb/out00-PYZ.pyz/couchbase.exceptions", line 18, in <module>
ImportError: No module named _libcouchbase

看上去很神秘。谢谢你对为什么会发生这种事的想法!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-18 15:40:42

尝试创建一个名为hook-couchbase.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(('libcouchbase', '_libcouchbase'),
                                          PY_EXTENSION_SUFFIXES):
        bundled.extend(glob.glob(os.path.join(module_directory, libname + ext)))

    for f in bundled:
        name = os.path.join('couchbase', 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

构建时,将文件放置在其中的目录的路径作为--additional-hooks-dir参数的值提供,如下所示:

代码语言:javascript
复制
--additional-hooks-dir=<path_to_directory_of_hook_file>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30846524

复制
相关文章

相似问题

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