%20%EB%B0%8F%20gunzip%20%EC%98%A4%EB%A5%98.png)
Python의 패키지 하위 프로세스를 사용하여 파일을 압축하고 gzip하려고 합니다. 다음 명령을 사용하고 있습니다.
subprocess.call(['gunzip', a_path+myfile_gz], shell=True)
그런 다음 오류 메시지가 나타납니다.
gzip: 압축된 데이터를 터미널에서 읽을 수 없습니다. 강제로 압축을 풀려면 -f를 사용하세요.
그래서 나는 다음을 입력합니다:
subprocess.call(['gunzip', '-f', a_path+myfile_gz], shell=True)
똑같은 오류 메시지가 나타납니다. 를 입력하면 shell=False
더 나빠질 것입니다.
터미널에서 이 작업을 수행하면 제대로 작동하기 때문에 이것은 정말 이상합니다! 무엇이 잘못되고 있는지 아는 사람이 있나요?
답변1
문제는 당신이 통과하고 있다는 것입니다 shell=True
. 그래서 당신은 실행하고 있습니다
sh -c gunzip /path/to/file.gz
( a_path+myfile_gz
라고 가정 "/path/to/file.gz"
). 즉, shell
인수는 이므로 True
명령 목록의 첫 번째 요소는 셸 조각이고, 다른 인수는 해당 셸 조각에 대한 인수입니다(여기서는 $0
). 이것은문서.
생략하면 shell=True
작동하지만 좋은 코드는 아닙니다. 경로에서 문자열로 작업하지 마십시오.os.path
. 아마도 그렇게 a_path+myfile_gz
되어야 할 것 입니다 os.path.join(a_path, myfile_gz)
.
그럼에도 불구하고 Python에는 다음을 지원하는 기능이 내장되어 있습니다.보관소. 외부 명령을 사용하지 마십시오.