Subprocess.call() 및 gunzip 오류

Subprocess.call() 및 gunzip 오류

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에는 다음을 지원하는 기능이 내장되어 있습니다.보관소. 외부 명령을 사용하지 마십시오.

관련 정보