web-dev-qa-db-ja.com

OSエラー:[Errno 2] Djangoでpythonサブプロセスを使っている間、そのようなファイルやディレクトリはありません

subprocess.call()を使用してPythonコード内でシステムコールを行うためのプログラムを実行しようとしています。これにより、次のエラーが発生します。

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)

これを解決する方法について、いくつかの関連アドバイスを得ることができますか?

115

文字列をShell=Trueに渡す場合はsubprocess.callを使用してください。

docs から:

単一の文字列を渡す場合は、ShellTrueにする必要があります。それ以外の場合、文字列は引数を指定せずに実行するプログラムの名前を指定する必要があります。

subprocess.call(crop, Shell=True)

または

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

賛成できないので、@ jfsコメントを再投稿します。

@AnneTheAgile:Shell = Trueは必要ありません。さらに、必要でない限り使用しないでください(@ validのコメントを参照)。代わりに、各コマンドライン引数を個別のリスト項目として渡す必要があります。たとえば、「command 'arg 1' 'arg 2'」の代わりに['command'、 'arg 1'、 'arg 2']を使用します。 – jfs 15年3月3日10:02に

1
Dusan Maksic