셸 명령을 직접 실행하는 대신 파이썬의 OS 모듈 방식을 사용하는 이유는 무엇입니까?
하는 것이 Python의 기능을 , 파일 변경.os.system()
또는subprocess.call()
?
를 들어,왜 를예들어, 려하는이무까엇니입유를 하려고 합니까?os.chmod
하는대에를 하는 os.system("chmod...")
?
셸 명령을 직접 실행하는 대신 파이썬의 사용 가능한 라이브러리 방법을 최대한 사용하는 것이 더 "파이썬"하다는 것을 이해합니다.그러나 기능적 관점에서 이를 수행하는 데에는 다른 동기가 있습니까?
여기서 말하는 것은 단순한 한 줄 셸 명령을 실행하는 것입니다.더는 작업실에대보많은필때요할어제가, 다을사이다니것해합을는용하저는음행한다▁when▁using다니▁i를 사용하는 것으로 알고 있습니다.subprocess
예를 들어 모듈이 더 말이 됩니다.
더 빠릅니다.
os.system
그리고.subprocess.call
이렇게 간단한 것에는 불필요한 새로운 프로세스를 만듭니다. 실은.os.system
그리고.subprocess.call
shell
두 . 첫 번째이고 두 번째 중인 입니다. (셸에 경우에는 셸입니다.)test
).일부 명령은 별도의 프로세스에서 유용하지 않습니다.예를 들어, 를 실행할 경우
os.spawn("cd dir/")
자식 프로세스의 현재 작업 디렉터리는 변경되지만 Python 프로세스는 변경되지 않습니다.은 야합다니해를 사용해야 .os.chdir
그것 때문에셸에 의해 해석되는 특수 문자에 대해 걱정할 필요가 없습니다.
os.chmod(path, mode)
, 파일이름무작동반는면하든엇이이,반▁no,os.spawn("chmod 777 " + path)
파일 이름이 다음과 같은 경우 심하게 실패합니다.; rm -rf ~
((으)를 하면 이 할 수subprocess.call
없이shell
인수).대시로 시작하는 파일 이름에 대해 걱정할 필요가 없습니다.
os.chmod("--quiet", mode)
이 " 이이지정파사일변권다경니합"인 권한을 합니다.--quiet
,그렇지만os.spawn("chmod 777 --quiet")
실패할 것입니다.--quiet
인수로 해석됩니다. 이에도해다니됩당는에도 됩니다.subprocess.call(["chmod", "777", "--quiet"])
.Python의 표준 라이브러리가 이 문제를 처리하도록 되어 있기 때문에 크로스 플랫폼 및 크로스 셸에 대한 우려가 적습니다.시스템에 다음 기능이 있습니까?
chmod
명령? 요?설치되어 있습니까?지원할 것으로 예상되는 매개 변수를 지원합니까? 그os
모듈은 가능한 한 교차 플랫폼이 되도록 노력하고 가능하지 않을 때 문서화할 것입니다.실행 중인 명령어에 중요한 출력이 있는 경우에는 휴대성에 신경을 쓰지 않는 경우에도 코너 케이스(공백, 탭 및 줄 바꿈)를 잊어버릴 수 있으므로 소리보다 더 까다로운 구문 분석이 필요합니다.
그것은 더 안전합니다.아이디어를 제공하는 것은 예제 스크립트입니다.
import os
file = raw_input("Please enter a file: ")
os.system("chmod 777 " + file)
사용자의 입력이 다음과 같은 경우test; rm -rf ~
그러면 홈 디렉토리가 삭제됩니다.
이것이 내장된 기능을 사용하는 것이 더 안전한 이유입니다.
따라서 시스템 대신 하위 프로세스를 사용해야 하는 이유도 있습니다.
명령을 실행할 때 모듈 또는 모듈을 사용하는 것보다 Python의 보다 구체적인 방법을 선호하는 네 가지 강력한 사례가 있습니다.
- 중복성 - 또 다른 프로세스를 생성하는 것은 중복성이며 시간과 자원을 낭비합니다.
- 휴대성 - 의 많은 방법
os
모듈은 여러 플랫폼에서 사용할 수 있지만 대부분의 셸 명령은 OS에 따라 다릅니다. - 결과 이해 - 임의 명령을 실행하는 프로세스를 생성하면 출력의 결과를 구문 분석하고 명령이 잘못되었는지 여부와 이유를 파악할 수 있습니다.
- 안전 - 프로세스는 지정된 모든 명령을 실행할 수 있습니다.이는 약한 설계이며 다음의 특정 방법을 사용하여 피할 수 있습니다.
os
모듈.
이중화(중복 코드 참조):
을 위해 중복된 "chmod
this들어▁man▁is▁a예-이 중간자는 새로운 프로세스 또는 하위 셸입니다.
시작:
하위 셸에서 명령(문자열)을 실행합니다...
새로운 프로세스를 생성하기 위한 모듈일 뿐입니다.
이러한 프로세스를 구축하지 않고도 필요한 작업을 수행할 수 있습니다.
이식성(소스 코드 이식성 참조):
이 모듈의 목적은 일반적인 운영 체제 서비스를 제공하는 것이며 설명은 다음으로 시작합니다.
이 모듈은 운영 체제에 종속된 기능을 사용하는 휴대용 방법을 제공합니다.
윈도우즈와 유닉스 모두에서 사용할 수 있습니다.사용하려고 합니다.os.system
/subprocess
하려면 두(「 」 「 」 「 」 「 」의 경우).ls
/dir
현재 운영 체제를 확인합니다.이 기능은 휴대성이 뛰어나지 않으며 나중에 훨씬 더 큰 불만을 일으킬 수 있습니다(출력 처리 참조).
명령의 결과 이해:
디렉터리에 파일을 나열하려고 합니다.
를 사용하는 os.system("ls")
/subprocess.call(['ls'])
기본적으로 파일 이름이 포함된 큰 문자열인 프로세스의 출력만 반환할 수 있습니다.
이름에 공백이 있는 파일과 두 개의 파일을 어떻게 구분할 수 있습니까?
파일을 나열할 권한이 없으면 어떻게 합니까?
데이터를 파이썬 객체에 어떻게 매핑해야 합니까?
이것들은 제 머리 속에서 나온 것일 뿐입니다. 그리고 이러한 문제들에 대한 해결책들이 있는데 왜 당신을 위해 해결된 문제를 다시 해결해야 합니까?
이것은 이미 존재하고 무료로 사용할 수 있는 구현을 반복하지 않음으로써 사용자 자신을 반복하지 않음 원칙("DRY"라고도 함)을 따르는 예입니다.
안전:
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")
시스템을 위험에 빠뜨릴 수 있는 많은 명령이 있습니다.
간단한 이유로 - 셸 함수를 호출하면 명령이 존재한 후 파괴되는 하위 셸이 생성되므로 셸에서 디렉터리를 변경해도 Python의 환경에는 영향을 주지 않습니다.
또한 하위 셸을 만드는 것은 시간이 많이 걸리기 때문에 OS 명령을 직접 사용하면 성능에 영향을 미칩니다.
편집
몇 가지 타이밍 테스트를 실행했습니다.
In [379]: %timeit os.chmod('Documents/recipes.txt', 0755)
10000 loops, best of 3: 215 us per loop
In [380]: %timeit os.system('chmod 0755 Documents/recipes.txt')
100 loops, best of 3: 2.47 ms per loop
In [382]: %timeit call(['chmod', '0755', 'Documents/recipes.txt'])
100 loops, best of 3: 2.93 ms per loop
내부 기능의 실행 속도가 10배 이상 빠름
EDIT2
외부 실행 파일을 호출하면 Python 패키지보다 더 나은 결과를 얻을 수 있는 경우가 있을 수 있습니다. - 방금 하위 프로세스를 통해 호출된 gzip의 성능이 사용한 Python 패키지의 성능보다 훨씬 높다는 동료의 메일이 생각났습니다.그러나 표준 OS 명령을 에뮬레이트하는 표준 OS 패키지에 대해서는 확실히 말할 수 없습니다.
대부분의 경우 셸 호출은 OS에 따라 다르며 파이썬 OS 모듈 기능은 그렇지 않습니다.그리고 하위 프로세스를 생성하지 않습니다.
훨씬 더 효율적입니다."쉘"은 많은 시스템 호출을 포함하는 또 다른 OS 바이너리일 뿐입니다.단일 시스템 호출에 대해 전체 셸 프로세스를 생성하는 오버헤드가 발생하는 이유는 무엇입니까?
사용할 때 상황은 더욱 심각합니다.os.system
포탄이 내장되지 않은 것을 위해.셸 프로세스를 시작하면 실행 파일이 시작되고 시스템 호출이 두 프로세스 떨어져 있습니다. 입니다.subprocess
셸 중개 과정의 필요성을 제거했을 것입니다.
파이썬에만 국한된 것이 아닙니다. systemd
같은 이유로 리눅스 시작 시간이 크게 향상되었습니다. 수천 개의 셸을 생성하는 대신 필요한 시스템 호출을 자체적으로 수행합니다.
언급URL : https://stackoverflow.com/questions/28572833/why-use-pythons-os-module-methods-instead-of-executing-shell-commands-directly
'bestsource' 카테고리의 다른 글
패키지 하위 디렉터리의 데이터 액세스 (0) | 2023.07.18 |
---|---|
마지막 Git 커밋을 준비되지 않은 영역으로 이동(또는 "실행 취소") (0) | 2023.07.18 |
get_user_model vs settings를 사용하는 Django.AUTH_USER_MODEL (0) | 2023.07.18 |
카프카와 마리애드브 통합을 위한 하나의 샘플 프로젝트 링크를 공유하는 사람이 있습니까? (0) | 2023.07.18 |
SQL Server 데이터베이스 이름에 사용할 수 있는 문자는 무엇입니까? (0) | 2023.07.18 |