如何在Emacs中使用Flymake模式通过pyflakes和pylint检查Python代码?

23 投票
4 回答
12851 浏览
提问于 2025-04-15 13:31

为了在Python模式下检查代码,我使用flymake配合pyflakes

另外,我还想用pylint来检查代码风格(pep8),关于这方面的描述可以在同一页面找到。

这个方法是有效的。 但是我无法将flymake配置成同时使用pyflakes和pylint。 我该怎么做呢?

4 个回答

0

你可以看看这里的Lisp脚本(http://charlie137-2.blogspot.com/2009/08/check-python-coding-style-on-fly-with.html),这个脚本可以帮助你检查PEP8规范,类似于pep8.py。我自己不使用pyflakes或pylint,但我想你可以很容易地调整这个脚本,让它和其他检查工具一起使用。

7

通常情况下,你可以在python模式的钩子里启用flymake模式。不过,这样做会导致一些问题,比如使用py-execute-buffer时会创建临时缓冲区,这会触发钩子,然后因为没有“真实文件”而导致flymake模式出现问题。解决这个问题的方法是修改添加钩子的条件,比如我用的是:

(add-hook 'python-mode-hook 
      (lambda () 
        (unless (eq buffer-file-name nil) (flymake-mode 1)) ;dont invoke flymake on temporary buffers for the interpreter
        (local-set-key [f2] 'flymake-goto-prev-error)
        (local-set-key [f3] 'flymake-goto-next-error)
        ))
36

好吧,flymake其实就是在寻找一个可以执行的命令,这个命令会输出一些格式固定的内容。你可以写一个shell脚本,里面依次调用你想要的所有检查工具……

你还需要确保你的脚本最后返回错误级别0。下面是一个例子:

这是我在一个“pycheckers”脚本中做的:

#!/bin/bash

epylint "$1" 2>/dev/null
pyflakes "$1"
pep8 --ignore=E221,E701,E202 --repeat "$1"
true

关于emacs lisp的部分:

(when (load "flymake" t)
  (defun flymake-pyflakes-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
           (local-file (file-relative-name
                        temp-file
                        (file-name-directory buffer-file-name))))
      (list "pycheckers"  (list local-file))))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.py\\'" flymake-pyflakes-init)))

撰写回答