복붙노트

[PYTHON] 파이프를 통해 stdin을 읽는 스크립트에서 pdb.set_trace ()를 사용하십시오.

PYTHON

파이프를 통해 stdin을 읽는 스크립트에서 pdb.set_trace ()를 사용하십시오.

파이프를 통해 stdin을 읽는 python 스크립트가 있는데, 그것을 pdb.set_trace ()와 함께 사용할 수 없습니다.

my_script.py:

#!/usr/bin/env python
import sys
import pdb

def main():
    for line in sys.stdin:
        print "Printing a line: " +line

if __name__=='__main__':
    status = main()

tempfile.csv가 두 줄짜리 파일이고,

$ cat tempfile.csv 
line1
line2

그러면 스크립트를 실행할 수 있습니다. $ cat tempfile.csv | ./my_script.py, 모든 것이 좋습니다 :

$ cat tempfile.csv | ./my_script.py 
Printing a line:  line1

Printing a line:  line2

반면에 pdb.set_trace ()를 어디에두면 오류가 발생합니다. 예를 들어, pdb.set_trace ()를 def main () 아래에두면 다음과 같이 나타납니다.

$ cat tempfile.csv | ./my_script.py 
> /home/ilangmore/mobiuss/TM/branches/hadooprotype/my_script.py(7)main()
-> for line in sys.stdin:
(Pdb) *** NameError: name 'line1' is not defined
(Pdb) *** NameError: name 'line2' is not defined
(Pdb) 
Traceback (most recent call last):
  File "./my_script.py", line 11, in <module>
    status = main()
  File "./my_script.py", line 7, in main
    for line in sys.stdin:
  File "./my_script.py", line 7, in main
    for line in sys.stdin:
  File "/usr/lib/python2.7/bdb.py", line 48, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/lib/python2.7/bdb.py", line 67, in dispatch_line
    if self.quitting: raise BdbQuit
bdb.BdbQuit

제 질문은 아마도이 질문과 관련이 있습니다 (즉, 기본적으로 pdb는 stdin에서 읽음). 그러나 더 많은 도움이 필요합니다.

해결법

  1. ==============================

    1.나를 위해 일한 예가 있습니다.

    나를 위해 일한 예가 있습니다.

    lines = sys.stdin.readlines()
    sys.stdin = open('/dev/tty')
    pdb.set_trace()
    
  2. ==============================

    2.것은 : 귀하의 스크립트가 현재 디버깅 중이기 때문에 cat은 데이터 전송을 중단하지 않습니다. 추적 할 때 stdin은 여전히 ​​cat + 키보드로 채워져 있습니다. 그 중 하나를 선택해야합니다.

    것은 : 귀하의 스크립트가 현재 디버깅 중이기 때문에 cat은 데이터 전송을 중단하지 않습니다. 추적 할 때 stdin은 여전히 ​​cat + 키보드로 채워져 있습니다. 그 중 하나를 선택해야합니다.

    전체 stdin을 읽을 수 있으며, set_trace ()는 stdin으로 채워지지 않습니다 :

    sys.stdin.read()
    pdb.set_trace()
    
  3. ==============================

    3.ripdb 모듈 (pip install ripdb)을 사용하면이 문제가 해결되었습니다.

    ripdb 모듈 (pip install ripdb)을 사용하면이 문제가 해결되었습니다.

  4. ==============================

    4.Celery RDB (Remote Debugger) contrib 모듈이 어떻게 작동하는지 살펴볼 수 있습니다.

    Celery RDB (Remote Debugger) contrib 모듈이 어떻게 작동하는지 살펴볼 수 있습니다.

    https://github.com/celery/celery/blob/master/celery/contrib/rdb.py

    스트림 처리가 많이 필요한 것 같지만 테스트를 마쳤습니다. 텔넷을 사용하여 새 로컬 네트워크 포트에 연결할 수 있습니다. 훨씬 더 나은 ipdb는 아니지만 간단히 pdb입니다.

  5. ==============================

    5.나는 오늘이 정확한 문제에 부딪쳤다. 나는 Winpdb가 완벽하게 작동한다는 것을 발견했다.

    나는 오늘이 정확한 문제에 부딪쳤다. 나는 Winpdb가 완벽하게 작동한다는 것을 발견했다.

  6. ==============================

    6.완전성을 위해, 나는 받아 들여진 응답에 근거를 두는 뒤에 오는 부호를 가진 작은 조각을 만들었다.

    완전성을 위해, 나는 받아 들여진 응답에 근거를 두는 뒤에 오는 부호를 가진 작은 조각을 만들었다.

    import sys; sys.stdin = open('/dev/tty'); import pdb; pdb.set_trace();
    
  7. from https://stackoverflow.com/questions/9178751/use-pdb-set-trace-in-a-script-that-reads-stdin-via-a-pipe by cc-by-sa and MIT license