일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 사이버보안
- 머신러닝
- 알고리즘
- 컴퓨터과학
- 클라우드컴퓨팅
- 프로그래밍
- 코딩
- 데이터구조
- 2
- 데이터분석
- 보안
- 웹개발
- Yes
- 네트워크
- 데이터과학
- 프로그래밍언어
- 컴퓨터비전
- 자바스크립트
- 빅데이터
- 데이터베이스
- 네트워크보안
- 버전관리
- 소프트웨어공학
- 인공지능
- 소프트웨어
- 파이썬
- 딥러닝
- 컴퓨터공학
- I'm Sorry
- 자료구조
- Today
- Total
스택큐힙리스트
subprocess.Popen에 문자열을 어떻게 전달하나요? (stdin 인수를 사용하여) 본문
다음을 수행한다면:
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
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
참고로, 프로세스의 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` 인수를 사용하여 파일 객체를 생성하고 이를 통해 데이터를 전달할 수 있습니다. 이를 통해 다양한 프로그램에 데이터를 전달할 수 있습니다.