파이썬 역 추적을위한 Quickfix 지원


18

런타임 오류가있는 파이썬 스크립트가 있다고 가정 해보십시오.

$ cat example.py  
#! /usr/bin/env python3

a = 1/0

이것은 다음을 제공합니다.

$ python3 example.py 
Traceback (most recent call last):
  File "example.py", line 3, in <module>
    a = 1/0
ZeroDivisionError: division by zero

Vim이 해당 파일의 문제가있는 줄 (이 경우 줄 3)로 이동하기를 원합니다. Vim이 C를 gcc사용하여 컴파일 시간에 오류를 포착 :make하고 quickfix창 을 사용 하면 잘 작동하기 때문에 Vim 이이 작업을 수행 할 수 있다는 것을 알고 있습니다 .

gcc에서 quickfix 출력

물론 Vim의 quickfix 창을 :set makeprg=python3\ %and로 채울 수는 :make있지만 트레이스 백이 가리키는 줄 번호로 이동하지는 않습니다. 살펴보면 :copen트레이스의 첫 번째 줄만 강조 표시되고 관련 줄 번호로 이동할 수 없습니다.

python3의 quickfix 출력

(필자는 데비안 jessie에서 Vim 7.4를 사용 하고 있습니다.)

내 질문은 :

  • 파이썬 트레이스 백에서 관련 줄 번호를 얻는 방법을 알도록 Vim을 구성 할 수 있습니까?

  • Vim이 관련 행 번호를 구문 분석하고 얻는 방법을 이미 알고있는 오류 형식을 추출하도록 Python 인터프리터를 수정할 수 있습니까?


스크립트에서 로거를 서브 클래 싱하여 한 줄에 하나씩 트레이스 백 포인트를 생성 한 다음 (시작 하려면 여기 참조 ) errorformatVim 용 컴파일러 플러그인을 작성하십시오 ( :help :compiler및 참조 :help write-compiler-plugin). 당신이하고있는 일을 정확히 알지 못하고 문서에서 모든 것을 파낼만큼 열성적 이지 않으면 노력할 가치 가 없습니다.
Sato Katsura

나는 당신이 그 해답을 유용하게 사용할 수에 StackOverflow에 비슷한 질문을 stackoverflow.com/questions/11333112/...
jalanb

답변:


7

Vim에는 "컴파일러"스크립트 세트가 제공되는데 그 중 하나는 "pyunit" 입니다. :compiler pyunit:make(를 'makeprg') 제안한 값으로 실행하면 quickfix가 예상대로 채워집니다. 그러나 스택 추적 수준이 하나 인 경우에만 잘 작동합니다.

컴파일러 스크립트를 개선하는 것이 유용한 연습이 될 것입니다.

언 스택 은 구문 분석에 대한 일반적인 메커니즘을 제공하고, 위치는 스택 추적에보고 및 내장 파이썬 지원이 볼 때 플러그인, 관심이있을 수 있습니다.


4

내장 컴파일러 플러그인 pyunit

jamessan 에서 이미 제안 했듯이 한 가지 옵션은 내장 컴파일러 플러그인을 사용하는 것입니다 pyunit.

:compiler pyunit
:set makeprg=python3\ %
:make

단점은 스택 추적을 단일 오류 메시지로 축소한다는 것입니다. 예를 들어 다음과 같은 파이썬 스크립트 :

def lumberjack():
    bright_side_of_death()

def bright_side_of_death():
    return tuple()[0]

lumberjack()

...이 오류 메시지를 생성합니다 :

|| Traceback (most recent call last):
lumberjack.py|7|  IndexError: tuple index out of range

자신의 컴파일러 플러그인 작성

대안으로 다음에서 자체 컴파일러 플러그인을 제공 할 수 있습니다 ~/.vim/compiler/python.vim.

if exists("current_compiler")
  finish
endif
let current_compiler = "python"

let s:cpo_save = &cpo
set cpo&vim

CompilerSet errorformat=
      \%*\\sFile\ \"%f\"\\,\ line\ %l\\,\ %m,
      \%*\\sFile\ \"%f\"\\,\ line\ %l,
CompilerSet makeprg=python3\ %

let &cpo = s:cpo_save
unlet s:cpo_save

로 플러그인을 수동으로 선택 :compiler python하거나 다음을 추가하여 자동으로로드하십시오 ~/.vim/after/ftplugin/python.vim.

if !exists("current_compiler")
  compiler python
endif

위의 python 스크립트를 사용하여 Vim은 다음과 같이 빠른 수정 사항 창을 채 웁니다.

|| Traceback (most recent call last):
lumberjack.py|7| in <module>
||     lumberjack()
lumberjack.py|2| in lumberjack
||     bright_side_of_death()
lumberjack.py|5| in bright_side_of_death
||     return tuple()[0]
|| IndexError: tuple index out of range

자세한 내용 :help write-compiler-plugin은 참조하십시오.


3

quickfix.py 는 역 추적 오류 형식으로 역 추적을 구문 분석합니다. 다음은 한 줄로 파일에서 실행하는 예입니다 1 / 0.

❯❯❯ quickfix.py tests/errors/div_by_zero.py
"tests/errors/div_by_zero.py":1: ZeroDivisionError: division by zero

기본적으로 사용자 파일을 표시하지만 시스템 파일도 표시 할 수 있습니다 (를 포함하는 파일에서 실행 import os; os.environ['123']).

❯❯❯ quickfix.py -a /tmp/test.py                                                                                                        
"/usr/lib/lib/python3.7/os.py":678: KeyError: '123'
"/tmp/test.py":1: in function <module>

구성 :

quickfix.py현재 경로에서 사용할 수 있습니다, 그것을 사용하는의 vimrc에 다음 줄을 추가합니다.

if has("autocmd")
  autocmd FileType python setlocal makeprg=quickfix.py\ %
  autocmd FileType python setlocal errorformat=%E\"%f\":%l:%m,
endif

-1

자동 방법은 아니지만 파이썬 Traceback은 행 번호 --- 3을 보여줍니다 --- 그래서 vim을 호출합니다.

$ vim +3 example.py

example.py커서로 세 번째 줄에를 엽니 다 .


2
나는 그것을 알고 있지만 이것은 Quickfix 지원에 관한 것입니다. :make이미 열어 놓은 파일을 실행 한 후 :3닫고 다시 여는 것보다 세 번째 줄로 건너 뛰는 것이 더 빠릅니다 . 또한이 작업을 수동으로 수행하면보다 복잡한 스택 추적이 어려워 Quickfix 지원이 필요합니다.
Nathaniel M. Beaver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.