Estou tentando executar um programa para fazer algumas chamadas de sistema dentro do código Python usando o subprocess.call()
que lança o seguinte erro:
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
Meu código Python atual é o seguinte:
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 obter conselhos relevantes sobre como resolver isso?
python
django
subprocess
Sandeep Mederametla
fonte
fonte
Respostas:
Use
shell=True
se você estiver passando uma string parasubprocess.call
.Dos documentos :
ou:
fonte
shell=True
é fortemente desencorajado nos casos em que a cadeia de comandos é construída a partir de entrada externa", consulte o link na resposta.shell=True
não é necessário. Além disso, você não deve usá-lo, a menos que seja necessário (consulte o comentário de @ valid). Você deve passar cada argumento da linha de comando como um item de lista separado, por exemplo, use em['command', 'arg 1', 'arg 2']
vez de"command 'arg 1' 'arg 2'"
.shell=True
. Os aspectos de segurança estão além do escopo desta pergunta.Não é possível votar novamente, então vou repostar o comentário do @jfs porque acho que deve ser mais visível.
fonte
No such file or directory
Também pode ser gerado se você estiver tentando colocar um argumento de arquivoPopen
entre aspas duplas.Por exemplo:
Nesse caso, você precisa remover aspas duplas.
fonte