web-dev-qa-db-fra.com

OSError: [Errno 2] Aucun fichier ou répertoire de ce type lors de l'utilisation du sous-processus python dans Django

J'essaie d'exécuter un programme pour passer des appels système dans le code Python à l'aide de subprocess.call(), ce qui génère l'erreur suivante:

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

Mon code Python actuel est le suivant:

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)

Puis-je obtenir des conseils pertinents sur la façon de résoudre ce problème?

120
Sandeep Mederametla

Utilisez Shell=True si vous passez une chaîne à subprocess.call.

De docs :

Si vous passez une chaîne unique, soit Shell doit être True, sinon la chaîne doit simplement nommer le programme à exécuter sans spécifier d'arguments.

subprocess.call(crop, Shell=True)

ou:

import shlex
subprocess.call(shlex.split(crop))
266
Ashwini Chaudhary

Je ne peux pas voter, je vais donc republier @jfs parce que je pense que ça devrait être plus visible.

@AnneTheAgile: Shell = True n'est pas requis. De plus, vous ne devriez pas l'utiliser sauf si cela est nécessaire (voir le commentaire de @ valid). Vous devez passer chaque argument de ligne de commande en tant qu’élément de liste distinct, par exemple, utilisez ['commande', 'arg 1', 'arg 2'] au lieu de "commande 'arg 1"' arg 2 "". - Jfs 3 mars 15 à 10:02

1
Dusan Maksic