PyInstaller打包pySiril脚本时无法识别模块的问题求助
解决pySiril打包exe时的模块缺失问题
我尝试复现pySiril的示例代码并编译为exe文件,用于分发天文摄影处理脚本。示例代码如下:
from pysiril.siril import Siril from pysiril.wrapper import Wrapper from pysiril.addons import Addons app = Siril(siril_exe='D:\\Programs\\Siril\\bin\\siril-cli.exe') # Starts pySiril cmd = Wrapper(app) # Starts the command wrapper help(Siril) # Get help on Siril functions help(Wrapper) # Get help on all Wrapper functions help(Addons) # Get help on all Addons functions cmd.help() # Lists of all commands cmd.help('bgnoise') # Get help for bgnoise command del app
使用以下命令打包:
pyinstaller -F main.py
打包后运行exe出现模块找不到错误:
Traceback (most recent call last): File "main.py", line 1, in <module> from pysiril.siril import Siril File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module File "pysiril\siril.py", line 32, in <module> ModuleNotFoundError: No module named 'changelog' [1824] Failed to execute script 'main' due to unhandled exception!
检查发现pysiril/siril.py中导入了以下模块:
import changelog import LogMsg import PipeReader import PipeWriter import ThreadSiril import tools
其中changelog可通过pip安装,但其余模块无法通过pip获取,且未打包时脚本运行完全正常。
解决方案
方法1:使用--hidden-import参数手动指定缺失模块
PyInstaller打包时不会自动识别包内相对导入的模块,需要通过--hidden-import参数明确指定。执行以下打包命令:
pyinstaller -F --hidden-import=changelog --hidden-import=LogMsg --hidden-import=PipeReader --hidden-import=PipeWriter --hidden-import=ThreadSiril --hidden-import=tools main.py
方法2:通过spec文件配置隐藏导入
- 先生成spec文件:
pyi-makespec main.py
- 打开生成的
main.spec文件,在Analysis部分的hiddenimports列表中添加所有缺失的模块:
a = Analysis( ['main.py'], pathex=[], binaries=[], datas=[], hiddenimports=['changelog', 'LogMsg', 'PipeReader', 'PipeWriter', 'ThreadSiril', 'tools'], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, )
- 使用spec文件打包:
pyinstaller main.spec
方法3:修改pysiril包内的导入方式(可选)
如果允许修改pysiril的源码,将siril.py中的绝对导入改为相对导入:
from . import changelog from . import LogMsg from . import PipeReader from . import PipeWriter from . import ThreadSiril from . import tools
修改后再用原命令打包即可,Python和PyInstaller都能正确识别相对导入的模块。
内容的提问来源于stack exchange,提问作者Quark-Coder
相关产品推荐
相关产品推荐

