我正在尝试使用pyinstaller
构建python源代码。一旦构建成功,我就运行二进制文件。一旦我运行二进制文件,我得到以下ImportError
:
PyUtils.CouchbaseClient", line 13, in <module>
ImportError: No module named couchbase
但是couchbase
已经安装,我能够运行原始的Python源代码而没有任何导入错误。转换成二进制后,我得到importterror。
由于您的程序动态导入couchbase, pyinstaller无法检测到它是必需的,如文档中指定的:
一些Python脚本以PyInstaller无法检测的方式导入模块:例如,通过使用变量数据的
__import__()
函数,或在运行时操纵sys.path
值。
文档的另一部分扩展了这个问题,并建议了处理此场景的一些变通方法:
因此,您需要显式地要求pyinstaller在构建过程中包含所需的模块。似乎最简单的方法是使用如果Analysis认为它已经找到了所有的导入,但应用程序失败了导入错误,问题是一个隐藏的导入;也就是说,一个对分析阶段不可见的导入。
当代码使用__import__
或exec
或eval
时,可能会发生隐藏导入。您会得到这些警告(参见构建时消息)。 当扩展模块使用Python/C API执行导入时,也会发生隐藏导入。当发生这种情况时,Analysis什么也检测不到。没有警告,只有运行时崩溃。
要找到这些隐藏的导入,设置
-v
标志(获取Python的详细导入)。一旦你知道了它们是什么,你就可以使用
--hidden-import=
命令选项,通过编辑规范文件,或者使用钩子文件(参见下面的使用钩子文件),将所需的模块添加到包中。
--hidden-import
参数:
--hidden-import=modulename
命名一个在代码中不可见的导入的Python模块。该模块将像在import
语句中命名一样被包含。
因此,在构建应用程序时请添加以下参数:
--hidden-import=couchbase
然而,一旦PyInstaller检测到couchbase
是必需的,运行结果可执行文件失败,ImportError
:
ImportError: No module named _libcouchbase
这个答案描述了为了解决这个问题应该做什么。