OSError: [Errno 2] Нет такого файла или каталога при использовании подпроцесса python в Django

Я пытаюсь запустить программу для выполнения некоторых системных вызовов внутри кода Python с помощью subprocess.call(), которая вызывает следующую ошибку:

Traceback (most recent call last):
      File "<console>", line 1, in <module>
      File "/usr/lib/python2.7/subprocess.py", line 493, in call
      return Popen(*popenargs, **kwargs).wait()
      File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
      raise child_exception
      OSError: [Errno 2] No such file or directory

Мой реальный код Python выглядит следующим образом:

url = "/media/videos/3cf02324-43e5-4996-bbdf-6377df448ae4.mp4"
real_path = "/home/chanceapp/webapps/chanceapp/chanceapp"+url
fake_crop_path = "/home/chanceapp/webapps/chanceapp/chanceapp/fake1"+url
fake_rotate_path = "/home/chanceapp/webapps/chanceapp.chanceapp/fake2"+url
crop = "ffmpeg -i %s -vf "%(real_path)+"crop=400:400:0:0 "+ "-strict -2 %s"%(fake_crop_path)
rotate = "ffmpeg -i %s -vf "%(fake_crop_path)+"transpose=1 "+"%s"%(fake_rotate_path)
move_rotated = "mv"+" %s"%(fake_rotate_path)+" %s"%(real_path)
delete_cropped = "rm "+"%s"%(fake_crop_path)
#system calls:
subprocess.call(crop)

Могу ли я получить некоторые рекомендации относительно того, как это решить?

Ответ 1

Используйте shell=True, если вы передаете строку в subprocess.call.

От docs:

Если передать одну строку, либо shell должен быть True, либо иначе строка должна просто называть программу, которая будет выполнена без указав любые аргументы.

subprocess.call(crop, shell=True)

или

import shlex
subprocess.call(shlex.split(crop))

Ответ 2

Невозможно поднять голос, поэтому я отправлю комментарий @jfs, потому что думаю, что он должен быть более заметным.

@AnneTheAgile: shell = True не требуется. Кроме того, вы не должны использовать это, если это необходимо (см. @действительный комментарий). Вы должны пройти каждый аргумент командной строки, как отдельный элемент списка, например, используйте ['command', 'arg 1', 'arg 2'] вместо "command" arg 1 '' arg 2 '". - 3 марта в 10:02