Thanks for the reply. Interestingly, there is no hypothesis code in the moviepy tests so I'm not sure why we get that plugins output section mentioning hypothesis.
I wonder if there's a way to start pdb or pudb in the failed build environment so that I can step through the test? hmmm Will try that next... for fun Here's one test that fails: # -*- coding: utf-8 -*- """Image sequencing clip tests meant to be run with pytest.""" import os import sys import pytest from moviepy.video.io.ImageSequenceClip import ImageSequenceClip from .test_helper import TMP_DIR def test_1(): images=[] durations=[] for i in range(5): durations.append(i) images.append("media/python_logo.png") durations.append(i) images.append("media/python_logo_upside_down.png") with ImageSequenceClip(images, durations=durations) as clip: assert clip.duration == sum(durations) clip.write_videofile(os.path.join(TMP_DIR, "ImageSequenceClip1.mp4"), fps=30) def test_2(): images=[] durations=[] durations.append(1) images.append("media/python_logo.png") durations.append(2) images.append("media/matplotlib_demo1.png") #images are not the same size.. with pytest.raises(Exception): ImageSequenceClip(images, durations=durations).close() if __name__ == '__main__': pytest.main() and here's the test failure output: ____________________________________ test_1 ____________________________________ def test_1(): images=[] durations=[] for i in range(5): durations.append(i) images.append("media/python_logo.png") durations.append(i) images.append("media/python_logo_upside_down.png") with ImageSequenceClip(images, durations=durations) as clip: assert clip.duration == sum(durations) > clip.write_videofile(os.path.join(TMP_DIR, > "ImageSequenceClip1.mp4"), fps=30) tests/test_ImageSequenceClip.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /gnu/store/zfw5y8356i5hmfghpix46qk3iaxg3i6y-python-decorator-5.0.9/lib/python3.9/site-packages/decorator.py:232: in fun return caller(func, *(extras + args), **kw) moviepy/decorators.py:54: in requires_duration return f(clip, *a, **k) /gnu/store/zfw5y8356i5hmfghpix46qk3iaxg3i6y-python-decorator-5.0.9/lib/python3.9/site-packages/decorator.py:232: in fun return caller(func, *(extras + args), **kw) moviepy/decorators.py:135: in use_clip_fps_by_default return f(clip, *new_a, **new_kw) /gnu/store/zfw5y8356i5hmfghpix46qk3iaxg3i6y-python-decorator-5.0.9/lib/python3.9/site-packages/decorator.py:232: in fun return caller(func, *(extras + args), **kw) moviepy/decorators.py:22: in convert_masks_to_RGB return f(clip, *a, **k) moviepy/video/VideoClip.py:300: in write_videofile ffmpeg_write_video(self, filename, fps, codec, moviepy/video/io/ffmpeg_writer.py:213: in ffmpeg_write_video with FFMPEG_VideoWriter(filename, clip.size, fps, codec = codec, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <moviepy.video.io.ffmpeg_writer.FFMPEG_VideoWriter object at 0x7fffd89ba160> filename = '/tmp/guix-build-python-moviepy-1.0.3.drv-0/ImageSequenceClip1.mp4' size = (260, 77), fps = None, codec = 'libx264', audiofile = None preset = 'medium', bitrate = None, withmask = False, logfile = -1 threads = None, ffmpeg_params = None def __init__(self, filename, size, fps, codec="libx264", audiofile=None, preset="medium", bitrate=None, withmask=False, logfile=None, threads=None, ffmpeg_params=None): if logfile is None: logfile = sp.PIPE self.filename = filename self.codec = codec self.ext = self.filename.split(".")[-1] # order is important cmd = [ get_setting("FFMPEG_BINARY"), '-y', '-loglevel', 'error' if logfile == sp.PIPE else 'info', '-f', 'rawvideo', '-vcodec', 'rawvideo', '-s', '%dx%d' % (size[0], size[1]), '-pix_fmt', 'rgba' if withmask else 'rgb24', > '-r', '%.02f' % fps, '-an', '-i', '-' ] E TypeError: must be real number, not NoneType moviepy/video/io/ffmpeg_writer.py:88: TypeError -- Here's the Guix package for the curious: ;;; GNU Guix --- Functional package management for GNU ;;; ;;; Copyright © 2022 jgart <jg...@dismail.de> ;;; This file is not part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. (define-module (guixrus packages moviepy) #:use-module (guix build-system python) #:use-module (guix download) #:use-module (guix git-download) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix utils) #:use-module (gnu packages) #:use-module (gnu packages check) #:use-module (gnu packages fonts) #:use-module (gnu packages python-check) #:use-module (gnu packages python-web) #:use-module (gnu packages python) #:use-module (gnu packages imagemagick) #:use-module (gnu packages video) #:use-module (gnu packages python-xyz)) (define-public python-proglog (package (name "python-proglog") (version "0.1.10") (source (origin (method url-fetch) (uri (pypi-uri "proglog" version)) (sha256 (base32 "1d6s9mg2fr3dr30x05cvsvw25kpakkzqyj2zyarawk1fr34ji335")))) (build-system python-build-system) (propagated-inputs (list python-tqdm)) (home-page "") (synopsis "Log and progress bar manager for console, notebooks, web...") (description "Log and progress bar manager for console, notebooks, web...") (license license:expat))) (define-public python-moviepy (package (name "python-moviepy") (version "1.0.3") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/Zulko/moviepy") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "088i5cms0bs0qcvfbbi8krgvllln62lb9rgnliz4as4j0b631c4p")))) (build-system python-build-system) (native-inputs (list python-coverage python-coveralls font-liberation python-pytest python-pytest-cov python-requests)) (propagated-inputs (list python-decorator python-imageio python-imageio-ffmpeg python-proglog python-requests python-tqdm)) (inputs (list ffmpeg imagemagick)) (arguments `(#:phases (modify-phases %standard-phases (replace 'check (lambda* (#:key tests? inputs #:allow-other-keys) (when tests? (invoke "pytest" "-vv"))))))) (home-page "https://zulko.github.io/moviepy/") (synopsis "Video editing with Python") (description "Video editing with Python") (license license:expat))) (define-public python-imageio-ffmpeg (package (name "python-imageio-ffmpeg") (version "0.4.7") (source (origin (method url-fetch) (uri (pypi-uri "imageio-ffmpeg" version)) (sha256 (base32 "0gkjkrmgbdcfqx010hp23ymrkp1zzmjbh88qliyf6qzkjy7q623s")))) (build-system python-build-system) (home-page "https://github.com/imageio/imageio-ffmpeg") (synopsis "FFMPEG wrapper for Python") (description "FFMPEG wrapper for Python") (license license:bsd-2)))