2010-07-26 3 views
11

os.system()을 사용하여 rm -rf, cd, make 등과 같은 명령을 실행하는 것이 적절한 경우 다른 스레드에서 회전을 해제하는 경우, xterm, ls?Python - os.system()을 사용하여 일반적인 Linux 명령을 실행할 수있는 경우

고려, 나는 그것이이 내장 된 파이썬 명령을 사용하는 것이 안전합니다 가정 대신 os.system을에게()

어떤 생각을 사용하고 있습니다 (제조업체 및 xterm 등 제외) 위의 명령의 아날로그 버전이? 나는 그 (것)들을 듣는 것을 싶을.

+3

지금까지 해답 이외에도 "접착제"언어로 파이썬을 사용하면 손에서 쉽게 벗어날 수 있습니다. 명령 줄에서 쉽게 수행 할 수있는 작업의 자동화 된 실행이 거의 대부분이며 Unix 이외의 시스템에 대해 걱정할 필요가없는 프로그램이있는 경우 셸 스크립트를 사용하지 않는 이유는 무엇입니까? –

+4

os.system 대신 subprocess 모듈을 사용하십시오. 프로세스에 대한 모든 종류의 제어를 원한다면 감사 할 것입니다. –

답변

18

규칙 :이 기능을 사용하기 위해 내장 된 파이썬 함수가있는 경우이 함수를 사용하십시오. 왜? 따라서 코드를 다른 시스템에 이식 할 수 있으며, 추가 프로세스를 생성 할 필요가 없기 때문에 더 빠르고 안전합니다.

+5

: 많은 작업을 수행해야하는 경우 새 프로세스를 많이 시작하면 성능 문제가 발생할 수 있습니다. –

+0

@Mattias, 훌륭한 발언, 나는 이것을 고려하여 나의 대답을 업데이트했다. –

4

대린의 대답은 좋은 시작입니다.

그 이상으로, 당신이 될 계획이 얼마나 휴대의 문제입니다. 프로그램이 합리적으로 "표준"및 "현대"리눅스에서만 실행될 것이라면 휠을 다시 발명 할 이유가 없습니다. make 또는 xterm을 다시 쓰려고하면 남자들을 하얀 코트에 넣어 보내 게 될 것입니다. 작동하고 플랫폼에 대한 걱정이 없으면 Python을 접착제로 사용하십시오!

알 수없는 시스템 간의 호환성이 큰 경우 플랫폼 독립적 인 방식으로 필요한 작업을 수행 할 수있는 라이브러리를 찾을 수 있습니다. 또는 현재 사용중인 시스템의 종류에 따라 이름, 경로 및 메커니즘이 다른 온보드 유틸리티를 호출하는 방법을 조사해야합니다.

2

os 모듈 내에 이미 해당하는 내용이없는 경우에만 os.system을 사용하는 것이 좋습니다. 왜 당신의 인생을 더 열심히 만드나요?

3

os.system이 적합 할 수있는 유일한 시간은 비 프로덕션 스크립트 또는 일종의 테스트를위한 신속하고 더러운 솔루션입니다. 그렇지 않으면 기본 제공 함수를 사용하는 것이 가장 좋습니다.

+0

이걸보기 전에 비슷한 대답을 올렸습니다 ... –

5

system()의 문제점 중 하나는 명령 줄을 구문 분석하고 실행하기위한 셸 구문 및 언어에 대한 지식을 의미한다는 것입니다. 이것은 입력을 적절하게 검증하지 않은 버그에 대한 가능성을 만들어 내며, 쉘은 변수 대체와 같은 것을 해석하거나 예상하지 못한 방식으로 인수가 시작하거나 끝나는 위치를 결정할 수 있습니다. 또한, 다른 OS의 쉘은 당신이 즉시 알아 차릴 수 없을 정도로 미묘한 분기를 포함하여 당신 자신의 다른 구문을 가질 수 있습니다. 이런 이유 때문에 system() 대신 execve()을 사용하는 것이 더 좋습니다. 즉, argv 토큰을 직접 전달할 수 있으며 입력 내용을 중간에 분석 (잘못 분석) 할 필요가 없습니다.

system() (이것은 execve()에도 적용됩니다)의 또 다른 문제점은 코드를 작성할 때 "이 프로그램을 찾아서이 인수를 전달하십시오"라는 것입니다. 이것은 버그로 이어질 수있는 몇 가지 가정을합니다. 첫째, 프로그램이 존재하며 $PATH에서 찾을 수 있습니다. 어쩌면 어떤 시스템에서는 그렇지 않을 수도 있습니다. 둘째, 어쩌면 일부 시스템 또는 향후 OS 버전에서 다른 옵션을 지원할 것입니다. 이 의미에서, 나는 당신이 절대적으로 당신이 달릴 시스템이 프로그램을 가질 것이라는 것을 확신하지 않는 한 이것을하는 것을 피할 것입니다. (어쩌면 호출 프로그램을 시스템에 두거나, 호출하는 방법이 POSIX와 같은 명령에 의해 위임 된 것처럼)

마지막으로 ... 올바른 프로그램을 찾는 것과 관련하여 성능이 저하됩니다. 새 프로세스 만들기, 프로그램로드 등mv과 같은 간단한 작업을 수행하는 경우 시스템 호출을 직접 사용하는 것이 훨씬 효율적입니다.

다음은 system()을 피하기위한 몇 가지 이유입니다. 분명히 더 있습니다.

4

질문에 두 부분이있는 것 같습니다. "xterm", "rm -rf"및 "cd"와 같은 호출 명령을 언급합니다.

사이드 노트 : 하위 쉘에서 'cd'를 호출 할 수 없습니다. 그게 속임수가 아닐까? ...

"rm -rf SOMETHING"과 같이 다른 명령 수준의 작업에 대해서는 이미 파이썬과 동일합니다. 이것은 질문의 첫 번째 부분에 대한 대답입니다. 하지만 두 번째 부분에 대해 정말로 묻고있는 것 같습니다.

질문의 두 번째 부분은 "system() 또는 서브 프로세스 모듈과 같은 것을 사용해야합니까?"라고 다시 말할 수 있습니다.

나는 당신에게 간단한 대답을 가지고 있습니다. 프로토 타입을 제외하고는 "system()"을 사용하는 것에 대해 NO라고 말하십시오.

그것은 뭔가, 또는 "신속하고 더러운"스크립트 작동하는지 확인하기위한 괜찮지 만 os.system을()에 너무 많은 문제가있다 :

  1. 그것은 당신을 위해 쉘을 만들어 낸다 - 하나
  2. 필요하면 미세 그것은 당신을 위해 와일드 카드를 확장 - 당신이하지 않아도 잘하지 않는 한
  3. 이 재 처리 - 당신이
  4. 그것은 표준 오류/stdout에 출력을 덤프하고 읽 것을 원하는 좋은 경우 기본적으로 stdin
  5. 인용문을 이해하려고 시도하지만 잘 수행되지 않습니다. ('Cmd'> 'Ofileile')
  6. # 5와 관련하여 항상 인수 경계를 드러내지는 않습니다. 인수가 공백 인 경우)

"system()"에 no라고 말하면됩니다.

1

os.system 호출은 파이썬에서 'frowned upon'되기 시작합니다. '새'교체는 서브 프로세스 모듈의 subprocess.call 또는 subprocess.Popen입니다. 문서 확인 subprocess

하위 프로세스에 대한 다른 좋은 점은 stdout 및 stderr을 변수로 읽고 다른 파일로 리디렉션하지 않고도 처리 할 수 ​​있다는 것입니다.

다른 사람들이 위에서 말했듯이 대부분의 것들을위한 모듈이 있습니다. 다른 많은 명령어를 함께 붙이지 않는 한, 라이브러리에 포함 된 것들을 고수 할 것입니다. 파일을 복사하는 중이라면 tarfile/zipfile과 같은 모듈이있는 아카이브를 사용하여 shutil을 사용하십시오.

행운을 빈다.

관련 문제