在开发moviepy的Python程序使用pyinstaller打包后执行,报了两个错:

  1. AttributeError: module ‘moviepy.video.fx.all’ has no attribute ‘crop’
  2. AttributeError: module ‘moviepy.audio.fx.all’ has no attribute ‘audio_fadein’

这两个错是因为moviepy包下子包audio.fx.all、video.fx.all对应的目录moviepy\audio\fx\all、moviepy\video\fx\all下的包文件__init__.py中,分别使用了如下的方式import模块:

audio.fx.all子包

import pkgutil

import moviepy.audio.fx as fx

__all__ = [name for _, name, _ in pkgutil.iter_modules(
fx.__path__) if name != "all"] for name in __all__:
exec("from ..%s import %s" % (name, name))

video.fx.all子包

import pkgutil

import moviepy.video.fx as fx

__all__ = [name for _, name, _ in pkgutil.iter_modules(
fx.__path__) if name != "all"] for name in __all__:
exec("from ..%s import %s" % (name, name))

可以看到这两个子包使用的是一种动态加载模块的模式加载包下的模块的,pyinstaller对这种模式不能处理。

解决办法:

1、将这2个__init__.py文件的上面所列最后两行注释掉;

2、在Python中将上述注释掉两行代码后前面的内容复制后加一个如下输出语句的代码:

for name in __all__:
print("from moviepy.video.fx import %s" % (name))

如针对audio.fx.all,在Python中手工执行如下代码:

import pkgutil

import moviepy.video.fx as fx

__all__ = [name for _, name, _ in pkgutil.iter_modules(
fx.__path__) if name != "all"]
for name in __all__:
print("from moviepy.video.fx import %s" % (name))

输出如下:



将下面的输出语句拷贝到audio.fx.all的__init__.py,替换被注释的2行代码即可,最后完整的文件内容如下:

"""
Loads all the fx !
Usage:
import moviepy.video.fx.all as vfx
clip = vfx.resize(some_clip, width=400)
clip = vfx.mirror_x(some_clip)
""" import pkgutil import moviepy.video.fx as fx __all__ = [name for _, name, _ in pkgutil.iter_modules(
fx.__path__) if name != "all"] #for name in __all__:
# exec("from ..%s import %s" % (name, name))
#for name in __all__: print("from moviepy.video.fx import %s" % (name)) from moviepy.video.fx import accel_decel
from moviepy.video.fx import blackwhite
from moviepy.video.fx import blink
from moviepy.video.fx import colorx
from moviepy.video.fx import crop
from moviepy.video.fx import even_size
from moviepy.video.fx import fadein
from moviepy.video.fx import fadeout
from moviepy.video.fx import freeze
from moviepy.video.fx import freeze_region
from moviepy.video.fx import gamma_corr
from moviepy.video.fx import headblur
from moviepy.video.fx import invert_colors
from moviepy.video.fx import loop
from moviepy.video.fx import lum_contrast
from moviepy.video.fx import make_loopable
from moviepy.video.fx import margin
from moviepy.video.fx import mask_and
from moviepy.video.fx import mask_color
from moviepy.video.fx import mask_or
from moviepy.video.fx import mirror_x
from moviepy.video.fx import mirror_y
from moviepy.video.fx import painting
from moviepy.video.fx import resize
from moviepy.video.fx import rotate
from moviepy.video.fx import scroll
from moviepy.video.fx import speedx
from moviepy.video.fx import supersample
from moviepy.video.fx import time_mirror
from moviepy.video.fx import time_symmetrize

同样对moviepy\video\fx\all下的包文件__init__.py进行类似处理。这样处理后,再重新打包就可以解决掉该问题。

上述处理过程如果担心破坏原始的moviepy包,可以将python目录下的moviepy包拷贝一份到对应代码目录下再修改更好。

如老猿的moviepy安装目录如下:



将其复制一份到应用代码目录后应用代码目录结构如下:

此时再执行打包命令:

pyinstaller Video2Gif.py -w -p F:\study\python\project\loadApp

就可以打包后在生成的目录中直接执行Video2Gif.exe即可正常运行。

不过老猿使用PyQt开发的界面调用moviepy打包还是遇到了一点问题:

当同时使用-F和-w选项时,生成的不带其他文件的单一文件Video2Gif.exe执行时报错:



反复测试发现:

1、去掉 -F -w中任意一个都能正常执行生成的exe文件,不过去掉-F时是生成的一个带很多文件的子目录(包括要生成的exe文件),不是单一EXE文件,去掉-w时,会生成单一exe文件,但执行时除了图形界面窗口外还会出现控制台窗口,如图:



2、将代码中与moviepy相关的代码注释掉后,带 -F -w执行打包生成的exe文件能正常执行。

以上问题老猿还没找到解决办法,不过去掉 -F -w中任意一个打包的方式生成的文件也可用,因此也无需过于纠结。

修订说明:

本文部分内容存在错误,具体问题请见《关于moviepy打包报错AttributeError: module audio/video.fx.all has no attribute fadein、crop文章的纠错和抄袭

更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。

关于收费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

老猿Python,跟老猿学Python!

moviepy应用pyinstaller打包后执行报错AttributeError: module audio/video.fx.all has no attribute fadein、crop的更多相关文章

  1. 关于moviepy打包报错AttributeError: module audio/video.fx.all has no attribute fadein、crop文章的纠错和抄袭

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 老猿前面有篇文章<moviepy应用pyin ...

  2. 【解决】MacOS下 Python3.7 使用 pyinstaller 打包后执行报错 Failed to execute script pyi_rth__tkinter

    Fix tcl/tk libs inclusion in tkinter with Python3.7 under MacOS 使用 Pyinstaller 打包时候报错 3027 ERROR: Tc ...

  3. vue 使用webpack打包后路径报错以及 alias 的使用

    一.vue 使用webpack打包后路径报错(两步解决) 1. config文件夹 ==> index.js ==> 把assetsPublicPath的 '/ '改为 './' 2. b ...

  4. 解决Pyqt打包后运行报错:应用程序无法启动 因为程序的并行配置不正确

    做了一个生成二维码的小程序:http://www.cnblogs.com/dcb3688/p/4241048.html 直接运行脚本没问题,用pyinstaller打包后再运行就直接报错了: 应用程序 ...

  5. oracle创建包后执行报错:object omgmig.test_package is invalid.

    今天学习了一下oracle的包的写法,然后碰到这么个问题.包声明和包主体都正确,但是就是执行报错:object omgmig.test_package is invalid. 这是会报错的sql,看起 ...

  6. 使用jieba导入引用方法时,报错AttributeError: module 'jieba' has no attribute 'cut'

    一.问题描述 import jieba导入后,使用jieba.cut()方法时报错AttributeError: module 'jieba' has no attribute 'cut' 二.问题分 ...

  7. vue打包后接口报错

    最近自己和朋友做了一个小的项目,用的是vue3.x版本,本地dev运行的时候接口什么的都是正常的,但是build打包后本地使用anywhere启动一个本地服务的时候发现接口报错405状态,发布到线上接 ...

  8. 【Python】解决使用pyinstaller打包Tkinker程序报错问题

    问题描述 使用pyinstaller打包使用Tkinter编写的控制台程序,出现报错 15793 INFO: Adding Microsoft.Windows.Common-Controls to d ...

  9. vue项目打包后运行报错400如何解决

    昨天一个Vue项目打包后,今天测试,发现无论localhost还是服务器上都运行不了,报错如下: Failed to load resource: the server responded with ...

随机推荐

  1. 《为研发同学定制的MySQL面试指南》-- 连载中

    Hi大家好,我是来自博客园的赐我白日梦! 为大家带来MySQL面试专题!全文110篇!以问答的方式,由浅入深的帮你应对各类MySQL面试题的狂轰滥炸!当然也不乏会分享一些高阶读写分离数据库中间件原理及 ...

  2. php 导出excel 10万数据

    php导出excel 10万数据(此代码主要测试用) 在工作当中要对一些基本信息和其他信息导出 起初信息比较小无所谓.... 但当信息超出65535的时候 发现点问题了 超出了 而且 反应速度很慢 实 ...

  3. 英特尔与 Facebook 合作采用第三代英特尔® 至强® 可扩展处理器和支持 BFloat16 加速的英特尔® 深度学习加速技术,提高 PyTorch 性能

    英特尔与 Facebook 曾联手合作,在多卡训练工作负载中验证了 BFloat16 (BF16) 的优势:在不修改训练超参数的情况下,BFloat16 与单精度 32 位浮点数 (FP32) 得到了 ...

  4. 【线上问题排查技巧】动态修改LOGGER日志级别

    前言 大多数情况下,我们会在打印日志时定义日志的LOGGER级别,用来控制输出的信息范围. 一方面,过多的输出会影响查看日志的效率,另一方面,过少的日志让问题定位变得困难. 但当线上出现问题时,线上容 ...

  5. DB2添加联合主键

    CREATE TABLE EQUIPMENT_DAILY_CAL( EQU_DATE TIME NOT NULL ,/*日期*/ SEQ_ID INTEGER NOT NULL,/*序号 */ FAU ...

  6. [MIT6.006] 15. Single-Source Shortest Paths Problem 单一来源的最短路径问题

    首先简单介绍下最大路径问题:给定一个加权图,找到两点之间最短加权路径,本质上就是求两点之间哪条路径的权重和最小.有两种算法去做:Dijkatra和Bellman-Ford,后面几节课会专门讲这两个算法 ...

  7. binary hacks读数笔记(共享库)

    共享库从文件结构上来讲,与共享对象没什么区别.Linux下,共享库就是普通的ELF共享对象. 1.共享库命名: libname.so.x.y.z :其中最前面使用前缀lib,中间是库的名字和后缀&qu ...

  8. uboot分析——预备知识

    1. 刷机 刷机是使用fastboot,所以板子首先要已经能运行uboot,若ROM没有uboot,则使用sd卡或usb启动uboot. 板子进入uboot后,输入fastboot命令,进入fastb ...

  9. MySQL时间类型datetime、bigint及timestamp的查询效率

    前期数据准备 通过程序往数据库插入 50w 数据 数据表: CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `time_dat ...

  10. 磁盘构造/msdos分区(fdisk)格式化(mkfs)和挂载

    分区不是必要的,分区是与系统盘分开,防止数据丢失. 磁盘使用流程:查看磁盘(fdisk -l)---分区---格式化(创建文件系统)----挂载(自动挂载) 分区表类型:msdos(一般是系统分区)  ...