본문 바로가기
Python

subprocess (파이썬 모듈)

by yororing 2024. 8. 23.

00 개요

  • subprocess 모듈에 대한 정리

 

01 subprocess 모듈이란

1. 정의

  • subprocess 모듈은 새로운 프로세스를 생성하고, 그들의 입력/출력/에러 (input/output/error) 파이프에 연결하며, 반환 코드를 얻을 수 있게 함
  • os.system 및 os.spawn* 와 같은 오래된 모듈 및 함수를 대체하기 위해 만들어짐 

2. 사용

  • 서브프로세스를 호출할 때 권장되는 방법:
    • run() 함수 사용
    • Popen 인터페이스 사용 (advanced)
      • 프로세스 생성 및 관리는 기본적으로 Popen 클래스에 의해 처리됨

02 subprocess의 Popen 생성자

  • 프로세스 생성 및 관리는 기본적으로 Popen 클래스에 의해 처리됨

1. 문법

class subprocess.Popen(args, 
                       bufsize=-1, executable=None, 
                       stdin=None, stdout=None, stderr=None, 
                       preexec_fn=None, close_fds=True, 
                       shell=False, cwd=None, env=None, 
                       universal_newlines=None, startupinfo=None, 
                       creationflags=0, restore_signals=True, 
                       start_new_session=False, pass_fds=(), *, 
                       group=None, extra_groups=None, 
                       user=None, umask=-1, 
                       encoding=None, errors=None, text=None, 
                       pipesize=-1, process_group=None)

2. 자주 사용되는 arguments

  • Popen 생성자(및 편의 함수)는 여러가지 선택적 인수를 허용함
argument 설명
args - args는 모든 호출에 필수
- 문자열 또는 프로그램 인수의 시퀀스여야 함
- 일반적으로 인수의 시퀀스를 제공하는 것이 권장되는데, 이는 모듈이 인수의 escaping and quoting of arguments(예: 파일 이름에 공백이 포함된 경우)를 자동으로 처리할 수 있게 해주기 때문
- 단일 문자열을 전달할 경우, shell = True여야 하며(하단 참조), 그렇지 않으면 해당 문자열은 실행할 프로그램의 이름만 지정하고 인수는 포함하지 않아야 함
stdin, 
stdout, 
stderr
- stdin, stdout, stderr는 각각 실행된 프로그램의 표준 입력, 표준 출력, 표준 오류 파일 핸들을 지정
- 유효한 값은 None, PIPE, DEVNULL, 기존 파일 디스크립터(양의 정수), 그리고 유효한 파일 디스크립터를 가진 기존 파일 객체
  - None (기본값)일 경우에는 리다이렉션 미발생
  - PIPE는 자식 프로세스로의 새로운 파이프가 생성되어야 함을 나타냄
  - DEVNULL은 특수 파일 os.devnull이 사용됨을 의미
- stderr는 STDOUT이 될 수 있으며, 이는 자식 프로세스의 stderr 데이터를 stdout과 동일한 파일 핸들로 캡처해야 함을 나타냄
- stdin의 경우, 입력에 있는 줄 끝 문자 \n은 기본 줄 구분자인 os.linesep으로 변환됨
- stdout과 stderr의 경우, 출력의 모든 줄 끝 문자가 \n으로 변환됨
encoding,
errors,
text (universal_newlines)
- 해당 arguments들이 True인 경우 stdin, stdout, stderr 파일 객체는 호출 시 지정된 encoding, errors, 또는 io.TextIOWrapper의 기본값을 사용하여 텍스트 모드로 열
- text모드가 사용되지 않으면 stdin, stdout, stderr는 바이너리 스트림으로 열리며, 인코딩이나 줄 끝 문자 변환이 수행되지 않음
shell - shell이 True인 경우, 지정된 명령어가 shell을 통해 실행됨
- 이는 주로 Python을 사용하여 대부분의 시스템 셸보다 더 나은 제어 흐름을 제공하면서도, shell pipe, filename wildcard, environment variable expansion, ~을 사용자의 홈 디렉토리로 확장하는 등의 shell 기능에 편리하게 접근하고자 할 때 사용 가능
- 그러나 Python 자체가 많은 셸과 유사한 기능(특히 glob, fnmatch, os.walk(), os.path.expandvars(), os.path.expanduser(), shutil)을 구현하고 있다는 점 유의

 

3. Popen Objects

1) Popen 메소드

method 설명
Popen.poll() - checks if child process has terminated
- sets and returns returncode attribute
- otherwise, returns None
Popen.wait(timeout=None) - waits for child process to terminate
- sets and returns returncode attribute
- if the process does not terminate after timeout seconds, raises a TimeoutExpired exception
   - it is safe to catch this exception and retry the wait
Popen.communicate(input=None, timeout=None) - returns a tuple (stdout_data, stderr_data)
   - the data will be strings if streams were opened in text mode (otherwise, bytes)

- interacts with process: sends data to stdin
- reads data from stdout and stderr, until end-of-file is reached
- waits for process to terminate and set the returncode attribute
- the optional input argument should be data to be sent to the child process, or None, if no data should be sent to the child
   - if streams were opened in text mode, input must be a string
   - otherwise, it must be bytes
- 노트: if you want to send data to the process’s stdin, you need to create the Popen object with stdin=PIPE
- 노트: to get anything other than None in the result tuple, you need to give stdout=PIPE and/or stderr=PIPE
- if the process does not terminate after timeout seconds, a TimeoutExpired exception will be raised
   - catching this exception and retrying communication will not lose any output
Popen.send_signal(signal) - sends the signal signal to the child
- does nothing if the process completed
Popen.terminate() - stop the child
- On POSIX OSs the method sends SIGTERM to the child
- On Windows the Win32 API function TerminateProcess() is called to stop the child
Popen.kill() - kills the child
- On POSIX OSs the function sends SIGKILL to the child
- On Windows kill() is an alias for terminate()

 2) Popen 속성

attributes 설명
Popen.args - the args argument as it was passed to Popen
- a sequence of program arguments or else a single string
Popen.stdin - if the stdin argument was not PIPE, this attribute is None
- if the stdin argument was PIPE, this attribute is a writeable stream object as returned by open()
- if the encoding or errors arguments were specified or the text or universal_newlines argument was True, the stream is a text stream
- otherwise it is a byte stream
Popen.stdout - if the stdout argument was not PIPE, this attribute is None
- if the stdout argument was PIPE, this attribute is a readable stream object as returned by open()
   - reading from the stream provides output from the child process
- if the encoding or errors arguments were specified or the text or universal_newlines argument was True, the stream is a text stream
- otherwise it is a byte stream
Popen.stderr - if the stderr argument was not PIPE, this attribute is None
- if the stderr argument was PIPE (strdrr = PIPE), this attribute is a readable stream object as returned by open()
   - reading from the stream provides error output from the child process
- if the encoding or errors arguments were specified or the text or universal_newlines argument was True, the stream is a text stream
- otherwise it is a byte stream
- 노트: use communicate() instead of .stdin.write, .stdout.read or .stderr.read to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process
Popen.pid - process ID of the child process
- 노트: if you set the shell = True, this is the process ID of the spawned (생성된) shell
Popen.returncode - child return code.
- initially None
- can be set by a call to the poll(), wait(), or communicate() methods if they detect that the process has terminated
- None value indicates that the process hadn’t yet terminated at the time of the last method call
- negative value -N indicates that the child was terminated by signal N (POSIX only)

참조

  1. https://docs.python.org/3/library/subprocess.html
  2.  
  3.  

'Python' 카테고리의 다른 글

cursor.iterate() (파이썬 메서드)  (0) 2024.09.04
공백 제거 (파이썬 함수)  (1) 2024.08.23
APScheduler (작업 스케줄러 파이썬 라이브러리)  (0) 2024.08.06
assert (파이썬 키워드)  (0) 2024.07.26
super()  (0) 2024.07.25