쉘이나 명령 프롬프트에 입력한 것처럼 Python 내에서 외부 명령을 어떻게 호출합니까?
subprocess
표준 라이브러리 의 모듈을 사용하십시오 .
import subprocess
subprocess.run(["ls", "-l"])
subprocess.run
over 의 장점 os.system
은 더 유연하다는 것입니다( stdout
, stderr
, , "실제" 상태 코드 , 더 나은 오류 처리 등을 얻을 수 있습니다...).
에 대한 설명서os.system
에서도 다음을 subprocess
대신 사용하도록 권장 합니다.
이
subprocess
모듈은 새로운 프로세스를 생성하고 결과를 검색하기 위한 보다 강력한 기능을 제공합니다. 이 기능을 사용하는 것보다 해당 모듈을 사용하는 것이 좋습니다. 몇 가지 유용한 레시피는 문서 의 하위 프로세스 모듈로 이전 함수 교체 섹션을 참조하세요 .subprocess
Python 3.4 및 이전 버전에서는 다음 subprocess.call
대신 사용 .run
하십시오.
subprocess.call(["ls", "-l"])
장점과 단점을 포함하여 외부 프로그램을 호출하는 방법 요약:
os.system
시스템의 쉘에 명령과 인수를 전달합니다. 실제로 이러한 방식으로 한 번에 여러 명령을 실행하고 파이프 및 입력/출력 리디렉션을 설정할 수 있기 때문에 이것은 좋습니다. 예를 들어:os.system("some_command < input_file | another_command > output_file")
그러나 이것이 편리하긴 하지만 공백 등과 같은 셸 문자의 이스케이프를 수동으로 처리해야 합니다. 반면에 이것은 단순히 쉘 명령이고 실제로는 외부 프로그램이 아닌 명령을 실행할 수도 있습니다.
os.popen
os.system
해당 프로세스의 표준 입력/출력에 액세스하는 데 사용할 수 있는 파일과 같은 개체를 제공한다는 점을 제외하고는 동일한 작업을 수행합니다 . 모두 약간 다르게 i/o를 처리하는 3개의 다른 popen 변형이 있습니다. 모든 것을 문자열로 전달하면 명령이 쉘로 전달됩니다. 목록으로 전달하면 아무 것도 탈출하는 것에 대해 걱정할 필요가 없습니다. 예시:print(os.popen("ls -l").read())
subprocess.Popen
. 이것은 을 대체하기 위한os.popen
것이지만 너무 포괄적이기 때문에 약간 더 복잡하다는 단점이 있습니다. 예를 들어 다음과 같이 말할 수 있습니다.print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()
대신에
print os.popen("echo Hello World").read()
그러나 4개의 다른 popen 함수 대신에 하나의 통합된 클래스에 모든 옵션이 있는 것이 좋습니다. 설명서 를 참조하십시오 .
subprocess.call
. 이것은 기본적으로Popen
클래스와 같으며 모든 동일한 인수를 사용하지만 명령이 완료될 때까지 기다렸다가 반환 코드를 제공합니다. 예를 들어:return_code = subprocess.call("echo Hello World", shell=True)
subprocess.run
. Python 3.5 이상 전용. 위와 유사하지만 훨씬 더 유연하고CompletedProcess
명령 실행이 완료되면 개체를 반환합니다.os.fork
,os.exec
,os.spawn
C 언어와 유사하지만 직접 사용하지 않는 것이 좋습니다.
subprocess
모듈은 아마도 당신이 사용하는 것일 것입니다 .
마지막으로 쉘에서 실행할 최종 명령을 문자열로 전달하는 모든 메소드에 대해 이스케이프 처리에 대한 책임은 사용자에게 있음을 유의하십시오. 전달한 문자열의 일부를 완전히 신뢰할 수 없는 경우 심각한 보안 문제가 있습니다. 예를 들어 사용자가 문자열의 일부/일부를 입력하는 경우입니다. 확실하지 않은 경우 이러한 메서드를 상수와 함께 사용하십시오. 의미에 대한 힌트를 제공하려면 다음 코드를 고려하십시오.
print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()
my mama didnt love me && rm -rf /
사용자가 전체 파일 시스템을 지울 수 있는 " "을 입력한다고 상상해 보십시오 .
일반적인 구현:
import subprocess
p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
print line,
retval = p.wait()
stdout
파이프 의 데이터로 원하는 작업을 자유롭게 수행할 수 있습니다 . 사실, 해당 매개변수( stdout=
및 stderr=
)를 생략하면 됩니다. 그러면 처럼 작동합니다 os.system()
.
'파이썬' 카테고리의 다른 글
[Python] 'for' 루프에서 인덱스 액세스 (0) | 2022.07.31 |
---|---|
[Python] 중첩된 디렉토리를 어떻게 안전하게 생성할 수 있습니까? (0) | 2022.07.31 |
[Python] 단일 표현식에서 두 개의 사전을 병합하려면 어떻게 해야 합니까? (0) | 2022.07.31 |
[Python] 파일이 예외 없이 존재하는지 어떻게 확인합니까? (0) | 2022.07.31 |
[Python] 파이썬에서 메타클래스란 무엇입니까? (0) | 2022.07.31 |