명령을 실행할 때 또는 os
모듈을 사용 하는 것보다 모듈 에서 Python의보다 구체적인 메소드를 선호하는 경우가 4 가지 있습니다 .os.system
subprocess
- 중복성 -다른 프로세스를 생성하는 것은 중복되며 시간과 자원을 낭비합니다.
- 이식성 -
os
모듈 의 많은 메소드는 여러 플랫폼에서 사용 가능하지만 많은 쉘 명령은 운영 체제마다 다릅니다.
- 결과 이해 -임의의 명령을 실행하기 위해 프로세스를 생성하면 출력 결과를 구문 분석하고 명령이 잘못한 이유 와 이유를 이해해야 합니다 .
- 안전 -프로세스는 주어진 명령을 실행할 수 있습니다. 이것은 약한 디자인이며
os
모듈 에서 특정 방법을 사용하면 피할 수 있습니다 .
이중화 ( 중복 코드 참조 ) :
실제로 최종 시스템 호출 ( chmod
예 :)로가는 도중에 중복 "중간자"를 실행하고 있습니다. 이 중개인은 새로운 프로세스 또는 하위 셸입니다.
보낸 사람 os.system
:
서브 쉘에서 명령 (문자열)을 실행합니다 ...
그리고 subprocess
산란 새로운 프로세스에 불과 모듈입니다.
이러한 프로세스를 생성하지 않고도 필요한 것을 수행 할 수 있습니다.
이 os
모듈의 목표는 일반적인 운영 체제 서비스를 제공하는 것이며 그 설명은 다음으로 시작합니다.
이 모듈은 운영 체제 종속 기능을 사용하는 이식 가능한 방법을 제공합니다.
os.listdir
윈도우와 유닉스 모두에서 사용할 수 있습니다 . 이 기능에 os.system
/ 를 사용하려고하면 subprocess
두 개의 통화 ( ls
/ dir
) 를 유지 관리 하고 사용중인 운영 체제를 확인해야합니다. 이것은 이식성이 없으며 나중에 더 많은 좌절 을 일으킬 것 입니다 ( 출력 처리 참조 ).
명령 결과 이해 :
디렉토리에 파일을 나열하려고한다고 가정하십시오.
os.system("ls")
/를 사용하는 경우 subprocess.call(['ls'])
프로세스의 출력 만 다시 가져올 수 있습니다. 기본적으로 파일 이름이있는 큰 문자열입니다.
파일 이름에 공백이있는 파일을 두 파일에서 어떻게 알 수 있습니까?
파일을 나열 할 권한이 없으면 어떻게합니까?
데이터를 파이썬 객체에 어떻게 매핑해야합니까?
이것들은 내 머리 꼭대기에 있으며이 문제에 대한 해결책이 있지만 왜 당신을 위해 해결 된 문제를 다시 해결합니까?
이것은 이미 존재하며 자유롭게 사용할 수있는 구현을 반복 하지 않음 으로써 자신을 반복하지 않음 원칙 (종종 "건조"라고 함) 을 따르는 예입니다 .
안전:
os.system
하고 subprocess
강력하다. 이 힘이 필요할 때는 좋지만, 그렇지 않을 때는 위험합니다. 당신이 사용하는 경우 os.listdir
, 당신은 알고 그것을 어떤 다른 다른 다음 목록 파일을하거나 오류를 발생시킬 수 없습니다. 동일한 동작 을 사용 os.system
하거나 subprocess
달성 할 때 의도하지 않은 작업을 수행 할 수 있습니다.
주입 안전 ( 쉘 주입 예 참조 ) :
사용자의 입력을 새 명령으로 사용하는 경우 기본적으로 쉘을 제공합니다. 이것은 사용자를 위해 DB에 쉘을 제공하는 SQL 주입과 매우 유사합니다.
예를 들면 다음과 같은 형식의 명령이 있습니다.
# ... read some user input
os.system(user_input + " some continutation")
이것은 쉽게 실행하는 데 악용 될 수 있는 다음 입력을 사용하여 임의의 코드를 NASTY COMMAND;#
최종를 만들 :
os.system("NASTY COMMAND; # some continuation")
시스템을 위험에 빠뜨릴 수있는 명령이 많이 있습니다.