我正在尝试使用pyinstaller
构建python源代码。一旦构建成功,我正在运行二进制文件。运行二进制文件后,我得到以下ImportError
:
PyUtils.CouchbaseClient", line 13, in <module>
ImportError: No module named couchbase
但couchbase
已经安装,我可以运行原始Python源代码而不会出现任何导入错误。转换为二进制文件后,我得到ImportError。
任何帮助都会非常感激。
答案 0 :(得分:3)
由于您的程序动态导入 couchbase , pyinstaller 无法检测到它是必需的,如documentation中所述:
某些 Python 脚本以 PyInstaller 无法检测到的方式导入模块:例如,通过将
__import__()
函数与变量数据一起使用,或者操纵{{ 1}}运行时的值。
Another section of the documentation针对此问题进行了扩展,并提出了处理此方案的一些解决方法:
如果Analysis认为已找到所有导入,但应用程序因导入错误而失败,则问题是隐藏导入;也就是说,分析阶段不可见的导入。
当代码使用
sys.path
或__import__
或exec
时,可能会发生隐藏导入。您会收到有关这些警告(请参阅Build-time Messages)。当扩展模块使用 Python / C API 进行导入时,也会发生隐藏导入。发生这种情况时,Analysis无法检测到任何内容没有警告,只有运行时崩溃。
要查找这些隐藏的导入,请设置
eval
标记(Getting Python's Verbose Imports上方)。一旦你知道它们是什么,你可以使用
-v
命令选项,编辑spec文件或使用钩子文件(见下面的Using Hook Files)将所需的模块添加到包中。 / p>
因此,您需要明确要求 pyinstaller 在构建过程中包含所需的模块。似乎最简单的方法是使用--hidden-import
参数:
--hidden-import=
命名导入的 Python 模块,该模块在代码中不可见。该模块将被包含,就像它在--hidden-import=modulename
语句中命名一样。此选项可以多次出现。
因此,请在构建应用程序时添加以下参数:
import
但是,一旦 PyInstaller 检测到需要--hidden-import=couchbase
,运行生成的可执行文件就会失败并显示couchbase
:
ImportError
This answer描述了解决问题的方法。