OSError : [Errno 2] Django에서 Python 하위 프로세스를 사용하는 동안 해당 파일이나 디렉토리가 없습니다


137

Python 코드 내에서 일부 시스템 호출을 사용 subprocess.call()하여 다음 오류가 발생 하는 프로그램을 실행하려고합니다 .

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

내 실제 파이썬 코드는 다음과 같습니다.

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

답변:


301

shell=True에 문자열을 전달하는 경우 사용하십시오 subprocess.call.

에서 문서 :

하나의 문자열을 전달하는 경우 중 하나 shell여야합니다 True그렇지 않으면 문자열은 단순히 프로그램이 인수를 지정하지 않고 실행되는 이름을 지정해야합니다.

subprocess.call(crop, shell=True)

또는:

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

7
Python 3은 문제가되는 'file'이라는 이름을 가진 더 나은 오류 메시지를 제공하지만 shell = True가 필요하다는 힌트는 없습니다. 감사합니다!
AnneTheAgile

14
주의, 워드 프로세서는 상태가 "사용 shell=True되는 권장하지 명령 문자열이 외부 입력으로 구성되는 경우에는"이 질문에 대해 링크를 참조하십시오.
유효

23
@AnneTheAgile : shell=True필요하지 않습니다. 또한 필요한 경우가 아니면 사용하지 않아야합니다 (@ valid 's comment 참조). 대신 각 명령 줄 인수를 별도의 목록 항목으로 전달해야합니다 (예 : ['command', 'arg 1', 'arg 2']대신 사용) "command 'arg 1' 'arg 2'".
jfs

3
@ user3553031 다른 형식보다 권장하지 않습니다. 문자열을 사용하는 경우을 사용해야한다는 사실을 간단히 지적했습니다 shell=True. 보안 측면은이 질문의 범위를 벗어납니다.
Ashwini Chaudhary

6
@ user3553031 항상 권장되는 것은 아니며, 문서가 입력이 외부 입력에서 올 때 안전하지 않다고 분명히 밝히고 있습니다 . 당신이 그것을 사용해서는 안된다고 말하는 것은 말도 안됩니다. 하위 프로세스에 대한 질문이 너무 많으므로 모든 답변에서 이것을 언급하는 것은 의미가 없습니다. 다른 사용자의 의견이 이미 있으며 문서 링크를 공유했습니다. 내 답변을 편집 할 수 있습니다.
Ashwini Chaudhary

5

공감할 수 없으므로 @jfs 댓글을 다시 게시하여 더 잘 보이게해야한다고 생각합니다.

@AnneTheAgile : shell = 참이 필요하지 않습니다. 또한 필요한 경우가 아니면 사용하지 않아야합니다 (@ valid 's comment 참조). 대신 각 명령 줄 인수를 별도의 목록 항목으로 전달해야합니다. 예를 들어 "command 'arg 1' 'arg 2'"대신 [ 'command', 'arg 1', 'arg 2']를 사용하십시오. – jfs Mar 3 '15 at 10:02


2

No such file or directoryPopen큰 따옴표 로 파일 인수를 넣으려는 경우에도 발생할 수 있습니다 .

예를 들면 다음과 같습니다.

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.