Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- ROS #spin() #spinOnce() #ROS기초
- 파이썬 파일 전송
- 스트림 암호 one-time-pad 공격#보안#암호
- 패스트 캠퍼스 #자율주행 #비전
- 파이썬 열
- 리눅스기초#리눅스명령어#리눅스 tail#tail#모의해킹 리눅스
- 파파고 꿀팁
- 파이썬 #
- 통계 #ROC #TPR #FPR #TNR #이진분류 #Accuracy #Recall
- 파이썬 #파이썬프로젝트 #파이썬 예시 #파이썬 파일경로 #파이썬 자동화
- 파이썬 프로젝트
- QGC#QGrouncControl#GLIB오류
- 논문번역 꿀팁
- 크롬오류#크롬검색어자동완성끄기#검색어자동완성오류#검색어자동완성 제거#검색어 노란선#검색어반복입력
- 파이썬 텍스트 변환 #파이썬 공부
- 파이썬 예시
- 파이썬 유튜브
- ROS #Robotics #ROS기초
- PDF 개행문자
- 파파고 번역
- 파이썬 엑셀 파일 읽고 쓰기
- pdf 번역
- 파이선 행
- 파이썬#subprocess#communicate()
- 파이썬 채팅
- 파이썬 음성인식
- 파이썬 음성파일 텍스트 변환
- 파이썬
- 리눅스#모의해킹#리눅스명령어#head 명령어
- 파이썬#파이썬경로#파이썬폴더#파이썬디렉토리
Recent Comments
Archives
개발자비행일지
python subprocess 모듈, .communicate() 본문
- 파이썬으로 외부 명령어 실행
- 파이썬으로 외부 명령어를 실행하는 방법은 subprocess 모듈을 사용해서 실행한다.
subprocess.Popen() 이 함수는 로컬 프로그램, 명령어를 사용한다. Popen을 통해서 shell 명령어를 전달 할 수도 있는데 이를 위해서는 인자값을 True로 설정해 주어야 한다.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import subprocess
import shlex
# 문자열 명령어 실행
def subprocess_open(command):
popen = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
(stdoutdata, stderrdata) = popen.communicate()
return stdoutdata, stderrdata
# 배치 파일 등 실행
def subprocess_open_when_shell_false(command):
popen = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdoutdata, stderrdata) = popen.communicate()
return stdoutdata, stderrdata
# 문자열 명령어 실행
# shell 변수를 false 로 줄경우(default가 false) 명령어를 shelx.split() 함수로 프로세스가 인식 가능하게 잘라 주어야 함
def subprocess_open_when_shell_false_with_shelx(command):
popen = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdoutdata, stderrdata) = popen.communicate()
return stdoutdata, stderrdata
# 커맨드 리스트 처리
# 커맨드 리스트를 이전 처리의 결과(stdout)를 다음 처리의 입력(stdin)으로 입력하여 순차적으로 처리
def subprocess_pipe(cmd_list):
prev_stdin = None
last_p = None
for str_cmd in cmd_list:
cmd = str_cmd.split()
last_p = subprocess.Popen(cmd, stdin=prev_stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
prev_stdin = last_p.stdout
(stdoutdata, stderrdata) = last_p.communicate()
return stdoutdata, stderrdata
def main():
print subprocess_open('echo "aaa" | wc -l > a.txt')
# 실행결과
# --> ('', '') 파일 a.txt 생성
print subprocess_open_when_shell_false("./test.sh")
# test.sh
# #!/bin/bash
# echo "aaa" | wc -l > b.txt
# 실행결과
# --> ('', '') 파일 b.txt 생성
print subprocess_open_when_shell_false_with_shelx('echo -n "aaa"')
# 실행결과
# ('aaa', '')
print subprocess_open_when_shell_false_with_shelx('echo "aaa" | wc -l')
# 실행결과
# ('aaa | wc -l\n', '')
print subprocess_pipe(['echo "aaa"', "wc -l"])
# 실행결과
# ('1\n', '')
if __name__ == "__main__":
main()
subprocess 모듈
- 예제
- Popen 생성자: 프로세스를 시작
- communicate 메서드: 자식 프로세스의 출력을 읽어옴, 자식 프로세스가 종료할 때까지 대기
import subprocess
proc= subprocess.Popen(["echo", "Hello form the child!!"], stdout =subprocess.PIPE)
out, err = proc.communicate()
print(out.decode("utf-8"))
>>>Hello form the child!
- 자식 프로세스는 부모 프로세스와 파이썬 인터프리터와는 독립적으로 실행
- 자식 프로세스의 상태는 파이썬이 다른 작업을 하는 동안 주기적으로 폴링(polling)됨
import subprocess
proc= subprocess.Popen(["sleep", "0.3")
while proc.poll() is None:
print("working")
print(proc.poll()
print("Exit status", proc.poll())
>>> Working...
Working...
Exit status 0
- 부모에서 자식 프로세스를 떼어냄 => 부모 프로세스가 자유롭게 여러 자식 프로세스를 병렬로 실행할 수 있음
- 자식 프로세스를 떼어내려면?
- 모든 자식 프로세스를 먼저 시작하면 됨
'▶ Python' 카테고리의 다른 글
파이썬 format(), 16진수 변환, hex 값 변환 (0) | 2020.08.03 |
---|---|
파이썬 디렉토리 생성, 경로를 포함한 폴더생성, 경로생성 (0) | 2020.07.30 |
Python isinstance() 파이썬 자료형 확인 (0) | 2020.07.22 |
파이썬 OS 모듈, 디렉토리 위치 얻기 (0) | 2020.07.15 |
파이썬, 몬테카를로 시뮬레이션 (0) | 2020.07.15 |