반응형

출처 : https://stackoverflow.com/questions/32456881/getting-values-from-functions-that-run-as-asyncio-tasks

asyncio 작업(task)으로 실행한 함수에서 값 얻어오기

저는 다음 코드를 작성하였습니다.

import asyncio

@asyncio.coroutine
def func_normal():
        print("A")
        yield from asyncio.sleep(5)
        print("B")
        return 'saad'

@asyncio.coroutine
def func_infinite():
    i = 0
    while i<10:
        print("--"+str(i))
        i = i+1
    return('saad2')

loop = asyncio.get_event_loop()

tasks = [
    asyncio.async(func_normal()),
    asyncio.async(func_infinite())]

loop.run_until_complete(asyncio.wait(tasks))
loop.close()

저는 이 함수의 변수에서 값들을 어떻게 얻는지 모르겠습니다. 다음처럼 했는데 안 됩니다.

asyncio.async(a = func_infinite())

위처럼 keyword 인자로 값을 넘겼습니다. 함수 리턴값을 얻으려면 어떻게 해야 할까요?


3개의 답변 중 1개를 추려냄

코루틴은 기존처럼 작동합니다. loop.run_until_complete()로부터 리턴 값을 바로 사용하시면 되고 여러개의 결과를 모으기 위해 asyncio.gather()를 호출 합니다.

#!/usr/bin/env python3
import asyncio

@asyncio.coroutine
def func_normal():
    print('A')
    yield from asyncio.sleep(5)
    print('B')
    return 'saad'

@asyncio.coroutine
def func_infinite():
    for i in range(10):
        print("--%d" % i)
    return 'saad2'

loop = asyncio.get_event_loop()
tasks = func_normal(), func_infinite()
a, b = loop.run_until_complete(asyncio.gather(*tasks))
print("func_normal()={a}, func_infinite()={b}".format(**vars()))
loop.close()

출력

--0
--1
--2
--3
--4
--5
--6
--7
--8
--9
A
B
func_normal()=saad, func_infinite()=saad2
반응형
반응형

출처 : https://stackoverflow.com/Questions/4374455/how-to-set-sys-stdout-encoding-in-python-3

Python3에서 sys.stdout 인코딩 하는 방법

Python 2에서 기본 출력 인코딩으로 설정하는 것은 잘 알려진 구문입니다.

sys.stdout = codecs.getwriter("utf-8")(sys.stdout)    

이는 UTF-8로 출력을 인코딩하여 codec writer에서 sys.stdout를 포장(wrap)합니다.

하지만, 이 기술은 Python 3 에서는 작동하지 않습니다. 그 이유는 sys.stdout.write()str를 예상하는데 인코딩의 결과는 bytes이고 codecs가 원래 sys.stdout로 인코딩된 바이트배열을 출력하려고 할 때 오류가 발생합니다.

Python 3에서 이를 할 수 있는 올바른 방법은 무엇입니까?


7개의 답변 중 2개의 답변만 추려냄.

Python 3.7부터 당신은 reconfigure()로 표준 스트림의 인코딩을 변경할 수 있습니다.

sys.stdout.reconfigure(encoding='utf-8')

당신은 errors 파라미터를 추가하여 인코딩 오류가 다뤄질 수 있도록 수정할 수 있습니다.


Python 3.1에 io.TextIOBase.detach()가 추가되었습니다. 다음은 sys.stdout에 대한 문서 내용입니다.

표준 스트림은 기본으로 text 모드입니다. 이 스트림에 이진(binary) 데이터를 쓰거나 읽기 위해 기본 바이너리 버퍼를 사용합니다. 예를 들어 stdout에 바이트 배열을 쓰기 위해 sys.stdout.buffer.write(b'abc')를 사용합니다. io.TextIOBase.detach()를 사용함으로써, 스트림은 기본으로 바이너리가 될 수 있습니다. 이 함수는 바이너리로 stdinstdout을 설정합니다.

def make_streams_binary():
    sys.stdin = sys.stdin.detach()
    sys.stdout = sys.stdout.detach()

그리하여, Python 3.1 이상에서 대응되는 구문은 다음과 같습니다.

sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
반응형

+ Recent posts