bestsource

셸 명령을 직접 실행하는 대신 파이썬의 OS 모듈 방식을 사용하는 이유는 무엇입니까?

bestsource 2023. 7. 18. 21:50
반응형

셸 명령을 직접 실행하는 대신 파이썬의 OS 모듈 방식을 사용하는 이유는 무엇입니까?

하는 것이 Python의 기능을 , 파일 변경.os.system()또는subprocess.call()?

를 들어,왜 를예들어, 려하는이무까엇니입유를 하려고 합니까?os.chmod하는대에를 하는 os.system("chmod...")?

셸 명령을 직접 실행하는 대신 파이썬의 사용 가능한 라이브러리 방법을 최대한 사용하는 것이 더 "파이썬"하다는 것을 이해합니다.그러나 기능적 관점에서 이를 수행하는 데에는 다른 동기가 있습니까?

여기서 말하는 것은 단순한 한 줄 셸 명령을 실행하는 것입니다.더는 작업실에대보많은필때요할어제가, 다을사이다니것해합을는용하저는음행한다▁when▁using다니▁i를 사용하는 것으로 알고 있습니다.subprocess예를 들어 모듈이 더 말이 됩니다.

  1. 빠릅니다.os.system그리고.subprocess.call이렇게 간단한 것에는 불필요한 새로운 프로세스를 만듭니다. 실은.os.system그리고.subprocess.callshell 두 . 첫 번째이고 두 번째 중인 입니다. (셸에 경우에는 셸입니다.)test).

  2. 일부 명령은 별도의 프로세스에서 유용하지 않습니다.예를 들어, 를 실행할 경우os.spawn("cd dir/")자식 프로세스의 현재 작업 디렉터리는 변경되지만 Python 프로세스는 변경되지 않습니다.은 야합다니해를 사용해야 .os.chdir그것 때문에

  3. 셸에 의해 해석되는 특수 문자에 대해 걱정할 필요가 없습니다. os.chmod(path, mode), 파일이름무작동반는면하든엇이이,반▁no,os.spawn("chmod 777 " + path)파일 이름이 다음과 같은 경우 심하게 실패합니다.; rm -rf ~((으)를 하면 이 할 수 subprocess.call 없이shell인수).

  4. 대시로 시작하는 파일 이름에 대해 걱정할 필요가 없습니다. os.chmod("--quiet", mode)이 " 이이지정파사일변권다경니합"인 권한을 합니다.--quiet,그렇지만os.spawn("chmod 777 --quiet")실패할 것입니다.--quiet인수로 해석됩니다. 이에도해다니됩당는에도 됩니다.subprocess.call(["chmod", "777", "--quiet"]).

  5. Python의 표준 라이브러리가 이 문제를 처리하도록 되어 있기 때문에 크로스 플랫폼 및 크로스 셸에 대한 우려가 적습니다.시스템에 다음 기능이 있습니까?chmod명령? 요?설치되어 있습니까?지원할 것으로 예상되는 매개 변수를 지원합니까?os모듈은 가능한 한 교차 플랫폼이 되도록 노력하고 가능하지 않을 때 문서화할 것입니다.

  6. 실행 중인 명령어에 중요한 출력이 있는 경우에는 휴대성에 신경을 쓰지 않는 경우에도 코너 케이스(공백, 탭 및 줄 바꿈)를 잊어버릴 수 있으므로 소리보다 더 까다로운 구문 분석이 필요합니다.

그것은 더 안전합니다.아이디어를 제공하는 것은 예제 스크립트입니다.

import os
file = raw_input("Please enter a file: ")
os.system("chmod 777 " + file)

사용자의 입력이 다음과 같은 경우test; rm -rf ~그러면 홈 디렉토리가 삭제됩니다.

이것이 내장된 기능을 사용하는 것이 더 안전한 이유입니다.

따라서 시스템 대신 하위 프로세스를 사용해야 하는 이유도 있습니다.

명령을 실행할 때 모듈 또는 모듈을 사용하는 것보다 Python의 보다 구체적인 방법을 선호하는 네 가지 강력한 사례가 있습니다.

  • 중복성 - 또 다른 프로세스를 생성하는 것은 중복성이며 시간과 자원을 낭비합니다.
  • 휴대성 - 의 많은 방법os모듈은 여러 플랫폼에서 사용할 수 있지만 대부분의 셸 명령은 OS에 따라 다릅니다.
  • 결과 이해 - 임의 명령을 실행하는 프로세스를 생성하면 출력의 결과를 구문 분석하고 명령이 잘못되었는지 여부와 이유를 파악할 수 있습니다.
  • 안전 - 프로세스는 지정된 모든 명령을 실행할 수 있습니다.이는 약한 설계이며 다음의 특정 방법을 사용하여 피할 수 있습니다.os모듈.

이중화(중복 코드 참조):

을 위해 중복된 "chmodthis들어▁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

반응형