Python – второй подпроцесс не открывается, если sys.argv содержит & символ

У меня есть скрипт Python, который загружает видео с помощью youtube-dl, а затем извлекает из него кадры с помощью ffmpeg. Это код:

def DownloadVideo():
    output_file = "/Users/francesco/Desktop/SOURCE/%(title)s-%(id)s.%(ext)s"
    check_call(["youtube-dl","--output", output_file, "--restrict-filenames", "-f", "best", sys.argv[1]])

def ConvertVideo(video):
    DEST = "/Users/francesco/Desktop/OUTPUT"
    SOURCE = "/Users/francesco/Desktop/SOURCE"
    ffmpeg_path = "/Users/francesco/Desktop/ffmpeg/ffmpeg"
    video_path = SOURCE + "/" + video
    dest_path = DEST + "/" + os.path.splitext(video)[0] + "-%d.png"
    check_call([ffmpeg_path, "-v", "0", "-i", video_path, "-f", "image2", dest_path])

def Main():
    DownloadVideo()
    for video in os.listdir("/Users/francesco/Desktop/SOURCE"):
       ConvertVideo(video)

Я запускаю команду python myscript.py myvideolink, и в процессе загрузки все идет нормально, но ConvertVideo не запускается, просто зависает на пару секунд, а затем программа закрывается.

Если я попытаюсь запустить ту же команду, пропуская DownloadVideo() (с видео, уже загруженным в папку), это тоже не сработает, но если я использую python myscript.py без argv[1], процесс ffmpeg работает! Почему это происходит?

Обновление: я попытался удалить параметр -v 0 в ffmpeg, чтобы увидеть, что на самом деле происходит, процесс ffmpeg запускается, но зависает следующим образом:

ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with llvm-gcc 4.2.1 (LLVM build 2336.11.00)
  configuration: --prefix=/Volumes/Ramdisk/sw --enable-gpl --enable-pthreads --enable-version3 --enable-libspeex --enable-libvpx --disable-decoder=libvpx --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-avfilter --enable-libopencore_amrwb --enable-libopencore_amrnb --enable-filters --enable-libgsm --enable-libvidstab --enable-libx265 --disable-doc --arch=x86_64 --enable-runtime-cpudetect
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100

Обновление 2: Оказывается, это происходит только тогда, когда аргумент (который является ссылкой) содержит символ «&». Кто-нибудь знает, почему это проблема для ffmpeg? Он не использует переменную arg...


person Hyperion    schedule 03.06.2015    source источник
comment
check_call значительно замедлит работу вашей программы, поскольку она ожидает завершения преобразования. Поскольку вы собираетесь перебирать имена видеофайлов и хотите преобразовать каждое из них в каталоге, я предлагаю использовать Открыть   -  person heinst    schedule 03.06.2015
comment
Но разве Popen не собирается открывать несколько параллельных процессов? Я имею в виду, если у меня есть 20 видео в исходной папке, оно откроет 20 параллельных процессов?   -  person Hyperion    schedule 03.06.2015
comment
Да, так он будет работать быстрее. или еще лучше создать класс потока, и таким образом вы сможете лучше обрабатывать ошибки   -  person heinst    schedule 03.06.2015


Ответы (1)


Я предполагаю, что вы указываете выходное местоположение, которое уже существует, и FFmpeg спрашивает вас, хотите ли вы перезаписать файл или нет, ожидая «y» (или что-то еще, что означало бы нет) на стандартный ввод. Чтобы предотвратить это, используйте параметр «-y», который не позволяет ему задавать этот вопрос и принудительно перезаписывает выходной файл.

person Ronald S. Bultje    schedule 03.06.2015
comment
Выходная папка пуста, и ffmpeg всегда спрашивает меня, хочу ли я перезаписать вывод, если он уже существует, я пытался удалить -v 0, чтобы посмотреть, что произойдет, и ffmpeg запускается, он просто застрял, как в журнале я' я отправил. - person Hyperion; 03.06.2015
comment
Я обнаружил, что проблема заключается в том, что аргумент содержит символ &. Вы знаете, как это может быть проблемой для ffmpeg? - person Hyperion; 03.06.2015