2017-03-14 11 views
0

파이썬에서 변수에 stdout을 저장하려고합니다. 내 현재의 솔루션은 파이썬 셸에서 잘 작동하지만 스크립트로 실행하면 오류가 발생합니다. 내가 무엇을 기대변수에 파이썬 표준 출력을 저장하는 것은 파이썬 쉘에서 작동하지만 스크립트로는 작동하지 않습니다.

import yaml 
    import sys 
    from slackclient import SlackClient 
    from io import StringIO # Python3 
    slack_token = "SOME TOKEN HERE" 
    sc = SlackClient(slack_token) 
    old_stdout = sys.stdout 
    result = StringIO() 
    sys.stdout = result 
    row_message = '[{"title": "Test", "pretext": "this is an example   message!", "text": "Super Awesome Test!"}]' 
    sc.api_call(
     "chat.postMessage", 
     channel="#channel_name", 
     username="My User", 
     icon_url="http://some.url.here/", 
     attachments=row_message 
    ) 
    sys.stdout = old_stdout 
    result_string = result.getvalue() 
    example = yaml.load(result_string)['ts'] 
    print(example) 

파이썬 쉘에서 내 출력이됩니다 : 여기 내 현재 테스트 코드는

>>> print(example) 
    1489460593.207577 
    >>> 

을하지만 코드를 저장하고 스크립트로 실행하면

# ./test 
    Traceback (most recent call last): 
     File "./test", line 22, in <module> 
     example = yaml.load(result_string)['ts'] 
    TypeError: 'NoneType' object is not subscriptable 

누구나 나를 파이썬 셸에서 작동하지만 스크립트로 작동하지 않는 이유를 밝힐 수 있습니까? 이 작품을 만들기 위해 무엇을 시도 할 수 있습니까? 감사.

+0

아무 것도 인쇄되지 않으므로 아무 것도 출력되지 않습니다. 아마도 Slack은 문자열을 반환하고 인쇄하지는 않습니다. 통역사가 어딘가에 저장하지 않은 결과를 처리하기 때문에 통역사에 인쇄됩니다. stdout 스왑을 제거하면 어떻게됩니까? 값이 인쇄됩니까? 내 추측은 그렇지 않다. 그냥 변수에 직접 저장하고 stdout을 사용하는 것을 그만 두십시오. – zstewart

답변

1

감사합니다. @ zstewart, 맞았습니다. 나는 그것을 단지 지나치게 복잡하게 만들고 있었다. 여기 내가 대신하고있는 것이있다.

 response = sc.api_call("chat.postMessage", channel="#channel", username="username", icon_url="http://some.url.here", attachments=row_message) 
     thread_val_list = [ val for key,val in response.items() if key=='ts' ] 
     thread_val = "".join(thread_val_list)