属性错误:'module'对象没有属性'audio_fadein'。

5
我使用cx_freeze将一个Python项目打包成一个文件夹,并生成了一个.exe文件和它所需的依赖文件,但当我运行这个.exe文件时,出现如下错误:
AttributeError: module 'moviepy.audio.fx.all' has no attribute 'audio_fadein'

AttributeError

我已经阅读了MoviePy的文档,但无法找出为什么会出现这种情况。我的Python程序在IDE(PyCharm)中运行得非常完美,但编译后,我遇到了MoviePy错误。我已经使用了推荐的from moviepy.editor import *

实际上我并没有直接在脚本中使用audio_fadein,所以它一定是在展示视频时被MoviePy调用的。以下是代码:

def cherrybyte():
    pygame.display.set_caption('©2017 CherryByte™ Software')
    pygame.mouse.set_visible(False)
    logo = VideoFileClip('CherryByte Logo.mp4')
    logo.preview()
    pygame.mouse.set_visible(True)

编辑:我现在也尝试将导入语句更改为from moviepy.editor import VideoFileClip,但出现完全相同的错误。


我不确定这是否相关,但使用'from moviepy.editor import *'并非“推荐”。要么只导入moviepy.editor并在所有命令前加上前缀,要么仅导入所需内容,例如'from moviepy.editor import VideoFileClip'。 - Tom Burrows
@Gloin 这正是MoviePy的创建者所推荐的方式 - 我已经阅读了文档并查看了代码,其中也有注释说明使用该方式。但是你给了我另一种尝试的方法,我很感激,今晚我会尝试一下,谢谢。 - Jayce
好的,也许当我说不推荐时,有点过于强硬了。在文档这里中,它指出:“如果你只需要另一个库中的一个或两个功能,最好直接导入所需内容”。我同意,通常进行批量导入更好,但我认为对于分发的代码,选择性导入是首选(肯定更快加载)。 - Tom Burrows
以下是moviepy.editor中的注释代码:“此文件旨在通过简单地键入以下内容轻松加载MoviePy的主要功能:
from moviepy.editor import *
特别是它将从video.fx和audio.fx文件夹中加载许多效果,并将它们转换为VideoClip方法,以便我们可以使用以下方式而不是
clip.fx( vfx.resize, 2 ) # 或者等价于 vfx.resize(clip, 2) 我们可以写成 clip.resize(2)
它还启动了一个PyGame会话(如果安装了PyGame),并启用了clip.preview()。” 但我会尝试您建议的方法,因为它可能会绕过错误。
- Jayce
好的,我已将导入语句更改为from moviepy.editor import VideoFileClip,这是我所需的全部内容,程序执行时没有出现错误,我再次将其构建到单个文件夹中,尝试运行可执行文件,并得到完全相同的错误。这可能是MoviePy的问题吗?我已更新我的问题,包括这个尝试。 - Jayce
显示剩余5条评论
4个回答

10

在使用pyinstaller构建.exe文件时,我遇到了同样的错误。然而,我将导入语句更改为from moviepy.video.io.VideoFileClip import VideoFileClip之后它有效运行了。


其他函数也可以类似地导入:https://github.com/Zulko/moviepy/issues/591#issuecomment-965203931 - uwe

2

对于所有遇到同样问题的人,我通过修改下图中显示的所选 init 文件来解决它:

文件位置

在其中有一段代码,导入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))

将此块注释掉,并手动导入所需的每个函数,如下所示:

from moviepy.video.fx.accel_decel import accel_decel
from moviepy.video.fx.blackwhite import blackwhite
from moviepy.video.fx.blink import blink
from moviepy.video.fx.crop import crop
from moviepy.video.fx.even_size import even_size
from moviepy.video.fx.fadein import fadein
from moviepy.video.fx.fadeout import fadeout
from moviepy.video.fx.mirror_x import mirror_x
from moviepy.video.fx.mirror_y import mirror_y
from moviepy.video.fx.resize import resize
#etc.

请将位于moviepy.audio.fx.all中的init与之前相同地处理。


0

我以与HunterDev相同的方式解决了这个错误。

以下是完整的代码:

Python 3.8.6\Lib\site-packages\moviepy\video\fx\all_init_.py

from moviepy.video.fx.accel_decel import accel_decel
from moviepy.video.fx.blackwhite import blackwhite
from moviepy.video.fx.blink import blink
from moviepy.video.fx.colorx import colorx
from moviepy.video.fx.crop import crop
from moviepy.video.fx.even_size import even_size
from moviepy.video.fx.fadein import fadein
from moviepy.video.fx.fadeout import fadeout
from moviepy.video.fx.freeze import freeze
from moviepy.video.fx.freeze_region import freeze_region
from moviepy.video.fx.gamma_corr import gamma_corr
from moviepy.video.fx.headblur import headblur
from moviepy.video.fx.invert_colors import invert_colors
from moviepy.video.fx.loop import loop
from moviepy.video.fx.lum_contrast import lum_contrast
from moviepy.video.fx.make_loopable import make_loopable
from moviepy.video.fx.margin import margin
from moviepy.video.fx.mask_and import mask_and
from moviepy.video.fx.mask_color import mask_color
from moviepy.video.fx.mask_or import mask_or
from moviepy.video.fx.mirror_x import mirror_x
from moviepy.video.fx.mirror_y import mirror_y
from moviepy.video.fx.painting import painting
from moviepy.video.fx.resize import resize
from moviepy.video.fx.rotate import rotate
from moviepy.video.fx.scroll import scroll
from moviepy.video.fx.speedx import speedx
from moviepy.video.fx.supersample import supersample
from moviepy.video.fx.time_mirror import time_mirror
from moviepy.video.fx.time_symmetrize import time_symmetrize

Python 3.8.6\Lib\site-packages\moviepy\audio\fx\all_init_.py


Python 3.8.6\Lib\site-packages\moviepy\audio\fx\all_init_.py

是与音频特效相关的 Python 代码文件路径。
from moviepy.audio.fx.audio_fadein import audio_fadein
from moviepy.audio.fx.audio_fadeout import audio_fadeout
from moviepy.audio.fx.audio_left_right import audio_left_right
from moviepy.audio.fx.audio_loop import audio_loop
from moviepy.audio.fx.audio_normalize import audio_normalize
from moviepy.audio.fx.volumex import volumex

更多信息请查看:https://github.com/Zulko/moviepy/issues/591


0

__init__.py 中的实际代码:

__all__ = [name for _, name, _ in pkgutil.iter_modules(
    fx.__path__) if name != "all"]

只需在[fx.__path__]周围加上方括号:

__all__ = [name for _, name, _ in pkgutil.iter_modules(
    [fx.__path__]) if name != "all"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接