186 votes

"OSError : [Errno 2] No such file or directory" lors de l'utilisation d'un sous-processus python avec commande et arguments

J'essaie d'exécuter un programme pour faire des appels système dans le code Python en utilisant subprocess.call() ce qui provoque 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 manière de résoudre ce problème ?

396voto

Ashwini Chaudhary Points 94431

Utilisation shell=True si vous passez une chaîne de caractères à subprocess.call .

De documents :

Si l'on passe une seule chaîne de caractères, l'une ou l'autre des options suivantes s'applique shell doit être True ou sinon, la chaîne doit simplement nommer le programme à exécuter sans sans spécifier d'arguments.

subprocess.call(crop, shell=True)

ou :

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

13voto

Daniil Mashkin Points 1282

No such file or directory peut également être levé si vous essayez de mettre un argument de fichier à Popen avec des guillemets.

Par exemple :

call_args = ['mv', '"path/to/file with spaces.txt"', 'somewhere']

Dans ce cas, vous devez supprimer les guillemets.

call_args = ['mv', 'path/to/file with spaces.txt', 'somewhere']

9voto

Dusan Maksic Points 1

Je ne peux pas faire de "upvote", je vais donc reposter le commentaire de @jfs car je pense qu'il devrait être plus visible.

@AnneTheAgile : shell=True n'est pas nécessaire. De plus, vous ne devriez pas l'utiliser à moins que cela ne soit nécessaire (voir le commentaire de @ valid). Vous devriez passer chaque argument de la ligne de commande comme un élément de liste séparé, par exemple, utilisez ['command', 'arg 1', 'arg 2'] au lieu de "command 'arg 1' 'arg 2'". - jfs Mar 3 '15 à 10:02

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X