使用moviepy写了一个项目,准备打包成exe文件,使用了pyinstaller。
打包后运行,却是这样的场景:
初步观察错误类型应该是moviepy中少编译了一个库,pyinstaller根据import链字节码生成执行文件,如果项目中调用了,按理说应该是会编译进来的。
阅读到了ZiddyEng在https://github.com/Zulko/moviepy/issues/591上的发言,准备从moviepy内部动手,研究这个问题。
在AppData\Local\Programs\Python\Python38-32\Lib\site-packages\moviepy\video\fx\all内的__init__.py中发现了这个语句:
__all__ = [name for _, name, _ in pkgutil.iter_modules(
fx.__path__) if name != "all"]
for name in __all__:
exec("from ..%s import %s" % (name, name))
moviepy要import进来的包不是使用标准import形式,而是写成了字符串,使用exec执行的方式引入。
在下面加上print(__all__)
运行一下写的moviepy程序,打印结果如下
说明把这些库给手动引入就好了
直接在for循环里添加这句话,在运行时,把输出的粘进去就好了
AppData\Local\Programs\Python\Python38-32\Lib\site-packages\moviepy\audio\fx\all\__init__.py那边也做同样的操作
再次打包,一切OK