Python에서 Shell 명령을 실행하는 방법은 여러 가지가 있습니다. Python에서 외부 명령을 호출하면 subprocess 모듈을 사용하는 것이 더 좋다고 지적합니다. 따라서 이 문서에서는 subprocess 모듈을 사용하여 셸 스크립트의 기능을 구현하는 방법을 설명합니다.
subprocess 모듈은 subprocess.call() 메서드, subprocess.check_call() 메서드 등과 같이 Linux 명령을 실행하는 다양한 메서드를 제공합니다. 이러한 메서드는 모두 Popen 클래스를 캡슐화한 것이므로 이 문서에서는 Popen 클래스 사용에 중점을 둡니다.
셸 명령 실행
실행할 명령을 Popen()에 전달하여 Popen 객체를 생성할 수 있으며, 그러면 해당 명령을 실행할 하위 프로세스가 생성됩니다. 예:
child = subprocess.Popen(["ping", "-c", "5", "leehao.me"])
1
위 코드는 ping -c 5 leehao.me 명령을 실행하기 위한 하위 프로세스를 생성합니다. 이 명령은 목록 형식으로 Popen() 메서드에 전달됩니다. ping -c 5 leehao.me의 문자열 형식을 직접 사용하려면 shell=True를 추가하여 이를 달성할 수 있습니다:
child = subprocess.Popen("ping -c 5 leehao.me" , shell=True )
1
공식 문서에는 보안상의 이유로 shell=True 사용을 권장하지 않는다고 명시되어 있습니다. 공식 문서.
자식 프로세스가 실행되기를 기다리는 중
자식 프로세스가 명령을 실행한 후 기본 프로세스는 하위 프로세스가 실행될 때까지 기다리지 않습니다. 메인 프로세스가 자식 프로세스의 실행이 끝날 때까지 기다리려면 Popen.wait() 메서드를 명시적으로 호출해야 합니다. 예:
child = subprocess.Popen(["ping", "-c", "5", "leehao.me"])
child.wait()< / p>
'상위 마무리' 인쇄
1
2
3
이런 방식으로 주 프로세스는 하위 프로세스가 실행될 때까지 기다립니다. ping 명령이 완료된 후 상위 종료의 출력이 인쇄됩니다.
실행 결과 가져오기
Popen() 하위 프로세스의 출력을 얻으려면 Popen.communicate() 메서드를 사용할 수 있습니다. 예:
def subprocess_cmd(명령) :
프로세스 = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
proc_stdout = process.communicate()[0]. Strip()
인쇄 proc_stdout
subprocess_cmd('echo leehao.me; echo www.leehao.me')
1
2
< p>34
5
6
출력:
leehao .me
www.leehao.me
process.communicate() 메소드는 메인 프로세스와 자식 프로세스 사이의 통신을 실현할 수 있습니다. 메인 프로세스는 이를 통해 자식 프로세스에 데이터를 보낼 수 있고, 자식 프로세스가 출력한 데이터를 읽을 수도 있습니다. 위의 예에서는 Popen 객체를 생성할 때 stdout=subprocess.PIPE를 지정하여 기본 프로세스가 하위 프로세스의 출력을 읽을 수 있도록 합니다.
communicate() 메소드는 튜플(stdoutdata, stderrdata)을 반환하고, process.communicate()[0]은 하위 프로세스의 표준 출력을 얻습니다.
communicate() 메서드를 호출한 후 메인 프로세스도 하위 프로세스의 실행이 완료될 때까지 기다린다는 점에 유의해야 합니다.
위의 예에서 하위 프로세스는 두 개의 문자열을 표준 출력으로 인쇄하고 기본 프로세스는 이러한 출력을 받아 인쇄합니다.