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


137

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)

これを解決する方法に関する関連アドバイスを入手できますか?


この質問に複製された質問は、はるかに良い答えを持っています。その質問を再度開いて、代わりにこの質問を複製する必要があります。
user3553031 2017年

回答:


301

shell=True文字列をに渡す場合に使用しますsubprocess.call

ドキュメントから:

単一の文字列を渡す場合、文字列であるか、そうでshellない場合True、文字列は引数を指定せずに実行するプログラムを単に指定する必要があります。

subprocess.call(crop, shell=True)

または:

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

7
Python 3は、問題のある「ファイル」という名前のエラーメッセージを表示しますが、shell = Trueが必要であるというヒントはありません。ありがとうございました!
AnneTheAgile 2014年

14
文書にshell=Trueは、「コマンド文字列が外部入力から作成れる場合は使用を強くお勧めません」とも記載されています。回答のリンクを参照してください。
有効

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

3
@ user3553031他の形式よりもお勧めしません。文字列を使用している場合は、を使用する必要があることを簡単に指摘しましたshell=True。セキュリティの側面は、この質問の範囲を超えています。
Ashwini Chaudhary 2017年

6
@ user3553031常に推奨されているわけではありません。ドキュメントでは、入力が外部入力からのものである場合は安全ではないと明確に述べています。あなたがそれをこれまでに使ってはいけないと言うのはナンセンスです。そして、サブプロセスに関して非常に多くの質問があり、これをすべての回答で言及することは意味がありません。すでに他のユーザーからのコメントがあり、ドキュメントへのリンクも共有しました。私の回答を編集してください。
Ashwini Chaudhary 2017年

5

賛成投票できないので、@ jfsコメントを再投稿します。これにより、見やすくなります。

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


2

No such file or directoryファイル引数をPopen二重引用符で囲もうとした場合にも発生します。

例えば:

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

この場合、二重引用符を削除する必要があります。

call_args = ['mv', 'path/to/file with spaces.txt', 'somewhere']
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.