파이썬 역 추적을위한 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.