OSError: [Errno 2] Nessun file o directory simile durante l'utilizzo del sottoprocesso di Python in Django


137

Sto cercando di eseguire un programma per effettuare alcune chiamate di sistema all'interno del codice Python utilizzando il subprocess.call()quale genera il seguente errore:

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

Il mio attuale codice Python è il seguente:

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)

Posso avere qualche consiglio pertinente su come risolverlo?


La domanda che è stata duplicata a questa domanda ha una risposta molto migliore. Quella domanda dovrebbe essere riaperta e questa invece duplicata.
user3553031

Risposte:


301

Utilizzare shell=Truese si passa una stringa a subprocess.call.

Da documenti :

Se si passa una singola stringa, o shelldeve essere Trueoppure la stringa deve semplicemente denominare il programma da eseguire senza specificare alcun argomento.

subprocess.call(crop, shell=True)

o:

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

7
Python 3 fornisce un messaggio di errore migliore, denominando il 'file' offensivo, ma non dà alcun suggerimento che shell = True sia richiesto. Grazie!
AnneTheAgile

14
Attenzione, i documenti dichiarano anche "l'uso di shell=Trueè fortemente sconsigliato nei casi in cui la stringa di comando è costruita da input esterni", vedere il link nella risposta.
valido il

23
@AnneTheAgile: shell=Truenon è richiesto. Inoltre non dovresti usarlo a meno che non sia necessario (vedi il commento di @ valid). Dovresti passare ogni argomento della riga di comando come un elemento di elenco separato, ad esempio, utilizzare ['command', 'arg 1', 'arg 2']invece di "command 'arg 1' 'arg 2'".
jfs

3
@ user3553031 Non lo sto raccomandando su altri formati. Ho semplicemente sottolineato il fatto che se stai usando una stringa, dovrai usarla shell=True. Gli aspetti di sicurezza vanno oltre lo scopo di questa domanda.
Ashwini Chaudhary,

6
@ user3553031 Non è sempre scoraggiato, la documentazione dice chiaramente che non è sicuro quando l'input proviene da un input esterno . Dire che non dovresti usarlo mai è una sciocchezza. E ci sono così tante domande sui sottoprocessi, non ha senso menzionarlo in ogni risposta. Ci sono già commenti a riguardo da parte di altri utenti e ho condiviso anche il link alla documentazione. Puoi modificare la mia risposta.
Ashwini Chaudhary,

5

Non posso votare quindi ripubblicherò il commento @jfs perché penso che dovrebbe essere più visibile.

@AnneTheAgile: shell = True non è richiesto. Inoltre non dovresti usarlo a meno che non sia necessario (vedi il commento di @ valid). Dovresti invece passare ogni argomento della riga di comando come elemento di elenco separato, ad esempio, usa ['command', 'arg 1', 'arg 2'] invece di "command 'arg 1' 'arg 2'". - jfs 3 marzo 15 alle 10:02


2

No such file or directorypuò anche essere sollevato se si sta tentando di inserire un argomento file Popencon virgolette doppie.

Per esempio:

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

In questo caso, è necessario rimuovere le virgolette doppie.

call_args = ['mv', 'path/to/file with spaces.txt', 'somewhere']
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.