반응형

출처 : https://stackoverflow.com/questions/21524642/splitting-string-with-pipe-character

파이프 글자로 문자열 분리하기("|")

저는 이 문자열을 값으로 분리할 수 없습니다.

"Food 1 | Service 3 | Atmosphere 3 | Value for money 1 "

저의 현재 코드입니다.

String rat_values = "Food 1 | Service 3 | Atmosphere 3 | Value for money 1 ";
String[] value_split = rat_values.split("|");

출력

[, F, o, o, d, , 1, , |, , S, e, r, v, i, c, e, , 3, , |, , A, t, m, o, s, p, h, e, r, e, , 3, , |, , V, a, l, u, e, , f, o, r, , m, o, n, e, y, , 1, ]

기대하는 출력

Food 1
Service 3
Atmosphere 3
Value for money 1

5개의 답변 중 1개의 답변만 추려냄

|는 정규식에서 메타글자입니다. 당신은 파이프를 escape 할 필요가 있습니다.

String[] value_split = rat_values.split("\\|");
반응형
반응형

출처
https://stackoverflow.com/questions/375427/non-blocking-read-on-a-subprocess-pipe-in-python

python에서 subprocess.PIPE로 non-blocking 읽기

저는 subprocess를 시작하기 위해 을 출력 스트림(표준출력)으로 접속하기 위해 subprocess 모듈을 사용하고 있습니다. 저는 그 출력을 non-blocking으로 읽도록 실행하고 싶습니다. .readline을 non-blocking으로 만들거나 .readline를 실행하기 전에 스트림에 데이터가 있는지 검사하는 방법이 있습니까? 저는 이를 Windows나 Linux에서 최소한의 작업으로 이식하고 싶습니다.
여기는 현재 제가 한 방법입니다. (데이터가 없을 때 .readline는 blocking됩니다.)

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()

29개의 답변 중 1개의 답변만 추려냄

fcntl, select, asyncproc는 이 경우 도움이 되지 않을 것입니다.
운영체제에 관계없이 blocking 없이 스트림을 읽는 신뢰성 있는 방법은 Queue.get_nowait()를 사용하는 것입니다.

import sys
from subprocess import PIPE, Popen
from threading  import Thread

try:
    from queue import Queue, Empty
except ImportError:
    from Queue import Queue, Empty  # python 2.x

ON_POSIX = 'posix' in sys.builtin_module_names

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # 쓰레드가 프로그램과 함께 죽습니다.
t.start()

# ... 여기서 다른 것을 합니다

# blocking 없이 한 줄을 읽습니다.
try:  line = q.get_nowait() # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else: # 한 줄을 얻었습니다.
    # ... 그 한 줄로 뭔가를 합니다.
반응형
반응형

11-1. 프로세스간 통신(Inter-Process Communication)

프로세스간 통신의 정의

독립된 프로세스 간에 데이터를 주고 받는 행위를 의미

프로세스간 통신의 문제점

독립된 프로세스는 (특정 시스템콜을 하지 않는한) 공유 메모리가 존재하지 않기 때문에 데이터를 주고 받는 것이 불가능.

해결책 : 독립된 프로세스들이 통신할 수 있도록 '파이프'를 제공.


파이프 생성함수

#include <unistd.h>

int pipe(int fd[2]);

파이프는 커널 객체이다. fd[1]은 파이프 입구, fd[0]은 파이프 출구로 사용한다.

리턴 : 성공시 0, 실패시 -1

파이프의 생성과 프로세스간 통신


파이프의 특징

1. 파이프는 fork 함수에 의해서 복사되지 않는다.

-> 파이프의 입출력을 의미하는 파일 디스크립터가 복사되는 것.

2. 파이프는 방향성이 존재하지 않는다.

-> 파이프의 입구와 출구만 있다. (자신이 쓰고 읽을 수 있는 문제 발생 가능)


양방향 통신을 위한 파이프의 생성

하나의 파이프는 하나의 용도로만 사용한다.

예시) A->B 파이프, B->A 파이프


11-2. 가위 바위 보 게임 구현하기

가위 바위 보 게임 구조

1단계 : 파이프 생성

2단계 : 자식 프로세스 생성

3단계 : (서버, 클라이언트 모두) 데이터 입력(가위 바위 보 선택)

4단계 : 파이프를 통해 데이터 전송(자식->부모)

5단계 : 승자 확인!

6단계 : 결과 전송(부모->자식)

반응형

+ Recent posts