스택큐힙리스트

subprocess.Popen에 문자열을 어떻게 전달하나요? (stdin 인수를 사용하여) 본문

카테고리 없음

subprocess.Popen에 문자열을 어떻게 전달하나요? (stdin 인수를 사용하여)

스택큐힙리스트 2023. 4. 28. 03:55
반응형

다음을 수행한다면:

import subprocess

from cStringIO import StringIO

subprocess.Popen(['grep','f'],stdout=subprocess.PIPE,stdin=StringIO('one\ntwo\nthree\nfour\nfive\nsix\n')).communicate()[0]

저는 이해합니다:

Traceback (most recent call last):

File , line 1, in ?

File /build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py, line 533, in __init__

(p2cread, p2cwrite,

File /build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py, line 830, in _get_handles

p2cread = stdin.fileno()

AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'

분명히 cStringIO.StringIO 객체는 파일 오리에 크게 가깝지 않아서 subprocess.Popen에 맞지 않습니다. 이를 어떻게 해결할 수 있을까요?

답변 1

Popen.communicate() 문서:

참고로, 프로세스의 stdin으로 데이터를 전송하려면 stdin=PIPE로 Popen 객체를 생성해야합니다. 마찬가지로, 결과 튜플에서 None 이외의 것을 얻으려면 stdout=PIPE 및/또는 stderr=PIPE를 지정해야합니다.

os.popen* 대체하기

pipe = os.popen(cmd, 'w', bufsize)

# ==>

pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin

경고 : 자식 프로세스가 차단되는 것을 피하기 위해 stdin.write (), stdout.read () 또는 stderr.read () 대신 communicate ()를 사용하십시오. 이는 다른 OS 파이프 버퍼 중 하나가 가득 차서 차단되는 상황을 방지합니다.

당신의 예시는 다음과 같이 작성될 수 있습니다.

from subprocess import Popen, PIPE, STDOUT

p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

grep_stdout = p.communicate(input=b'one\ntwo\nthree\nfour\nfive\nsix\n')[0]

print(grep_stdout.decode())

# -> four

# -> five

# ->

파이썬 3.5+ (3.6+에서는 encoding )에서, subprocess.run를 사용하여 입력을 문자열로 외부 명령어에 전달하고 종료 상태 및 출력을 문자열로 한 번에 반환할 수 있습니다.

#!/usr/bin/env python3

from subprocess import run, PIPE

p = run(['grep', 'f'], stdout=PIPE,

input='one\ntwo\nthree\nfour\nfive\nsix\n', encoding='ascii')

print(p.returncode)

# -> 0

print(p.stdout)

# -> four

# -> five

# ->

답변 2

서브 프로세스를 사용하면 Python에서 다른 프로그램을 실행하고 결과를 가져올 수 있습니다. subprocess.Popen () 함수를 사용하여 그러한 프로세스를 실행할 수 있습니다. 이 함수는 매개 변수로 명령어와 인수를 받아들입니다. 명령어를 문자열로 전달하면 인수가 없는 경우 함수가 실행됩니다. 그러나 때로는 다른 프로그램에 문자열을 전달하려고 합니다. 이를 위해 `stdin` 인수를 사용할 수 있습니다.

`stdin` 인수는 subprocess.Popen () 함수를 호출할 때 사용할 수 있는 옵션 중 하나입니다. 이 인수는 프로세스에 전달될 데이터를 나타내는 파일 객체입니다. 이 파일 객체는 `PIPE` 로 생성됩니다. 그리고 프로세스가 실행되면 `stdin` 인수를 사용하여 데이터를 전달할 수 있습니다.

예를 들어, 이미지 변환 프로그램이 있다고 가정합시다. 이 프로그램은 이미지를 수신하고 변환하여 반환합니다. 이 프로그램의 stdin 인터페이스를 사용하여 이미지 데이터를 전달할 수 있습니다. 다음 코드를 사용하여 이미지 데이터를 전달할 수 있습니다.

```python

import subprocess

image_data = open('image.png', 'rb').read()

p = subprocess.Popen(

['convert', '-', '-resize', '128x128', '-'],

stdin=subprocess.PIPE,

stdout=subprocess.PIPE,

)

output, error = p.communicate(input=image_data)

```

위 코드에서 Popen은 `stdin` 인수를 사용하여 변환 프로그램에 이미지 데이터를 전달합니다. Popen은 `stdout` 값을 반환합니다. 이후 `communicate` 메서드를 호출하여 프로세스가 끝날 때까지 기다린 후 결과 값을 반환합니다.

여기서, `stdin` 인수로 이미지 데이터를 전달하기 위해 `input` 매개 변수를 사용하였습니다. 이 매개 변수는 전달할 데이터를 나타냅니다. 파이썬 3에서, `input` 매개 변수는 `bytes` 형식을 요구합니다. 그러므로, 이미지 데이터를 바이트열로 읽고 이를 `input` 매개 변수에 전달했습니다.

그런 다음, `communicate` 메소드를 사용하여 파이썬 코드가 변환 프로그램이 완료될 때까지 기다리고 반환 값을 반환하는 방법을 살펴봅니다. 이 방법은 프로그램이 숨겨져 있을 때 사용하는 흔한 솔루션입니다. 예를 들어, OCR (Optical Character Recognition) 시스템에서 사용될 수 있습니다. 이 경우, 문자 이미지를 전달하고 결과를 확인하는 데 사용됩니다.

종합하면, 파이썬에서 `subprocess.Popen` 함수를 사용하여 다른 프로그램을 실행하고 결과를 가져올 수 있습니다. 그런데 어떻게 문자열을 전달할까요? 이를 위해 `stdin` 인수를 사용하여 파일 객체를 생성하고 이를 통해 데이터를 전달할 수 있습니다. 이를 통해 다양한 프로그램에 데이터를 전달할 수 있습니다.

반응형
Comments