python - 导入使用 PyInstaller 引用的本地模块
问题描述
我有一个正在处理的 python 脚本,我正在使用 pyinstaller 将其打包成一个可执行文件。
在脚本中,当它未编译时,我引用了一组工具,这些工具位于主脚本旁边的文件夹中,如下所示:
\parent
----->\tools\
------>db.py
------>file_utils.py
main.py
我省略了初始化,但它也在那里。在我的脚本中,我正在导入这些文件,例如
import tools.db
import tools.file_utils
所有这一切都很好。当我使用 PyInstaller 将其打包为可执行文件时,我收到了一个找不到工具的模块错误。我尝试将绝对路径添加到工具,将工具和相关文件添加到隐藏的导入,以及所有这些,但我觉得这是我在脚本中调用它们的方式。
我想所有这些帮助脚本可能只是在脚本旁边的父目录中,或者我可以将工具添加到 sys.path 并直接导入 db 和 fileutils ,但这似乎有点笨拙和/或混乱。有什么明显的我失踪了吗?
解决方案
因此,在将我的整个目录结构展平在 tmp 文件夹中以编写可执行文件,并将我的规范文件更改为不编译到不同的目录(以及将父目录添加到 -p 开关)并记住删除一个在另一个 py 文件中引用另一个不再存在的模块,我得到了这一切。
我想我会把这些部分拼凑起来,这样我以后可以让这项工作变得更容易,并尝试确定过程的哪一部分给我的打包 ImportErrors,但这是一个有用的练习,可以稍微分解 PyInstaller 的各个部分并了解有关钩子和导入以及模块/包级别导入的更多信息。
推荐阅读
- angular - 在动态添加的输入字段上自动对焦
- javascript - 在 setInterval 内调用函数
- android-studio - Android Studio 在哪里安装 VULKAN_SDK?
- flutter - 如何在颤振中添加全屏加载程序
- node.js - 在上下文中附加一个属性(express.js 中的请求)对象
- python-3.x - 如何绘制连接条形图顶部的线
- android - 使用 gradle 3.3.0 的 Proguard 警告“找不到引用的类 packagename.R$string”
- sql - 使用 TOP 和 WHERE 更新行
- wpf - WPF MVVM:从项目控件中的列表框中删除项目
- javascript - 是否可以使用 chrome 49 完全支持的最新 CSS 和 HTML5 功能构建 Angular 8 Web 应用程序?