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) |
참조
'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 |