Pylint не работает с Emacs GUI на OS X; работает из командной строки - PullRequest
4 голосов
/ 05 апреля 2011

При запуске из командной строки (emacs filename.py) flymake и pylint отлично работают вместе. Ошибки выделены правильно. (Хотя я не могу вспомнить всплывающую подсказку, чтобы получить подробную информацию об ошибке, потому что это текстовый режим)

При запуске из GUI (Carbon Emacs) Flymake немедленно возвращается, и первая строка в файле подсвечивается с ошибкой «in <module>». Первая строка показывает ошибку даже в сценарии «Hello World». Я хотел бы, чтобы она работала правильно в режиме GUI, чтобы я мог перемещаться с помощью мыши (я знаю, я знаю) и использовать всплывающие подсказки для получения подробностей на пилоне сообщается об ошибках.

Я установил pylint с помощью «easy_install pylint», а сценарии pylint и epylint находятся в «~/py/scripts». Я добавил этот каталог в мой PATH в моем .bashrc:

export PATH=$PATH:~/py/scripts

(Мой .profile - это символическая ссылка на мой .bashrc.)

Я понял, что Emacs-GUI не загружает путь из моего .bashrc, поэтому я создал файл ~ / .MacOSX / environment.plist, установив переменную PATH с полным PATH, который я вижу в терминале.

Теперь в Emacs-GUI "(getenv "PATH")" вывод выглядит правильно:

"/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/X11/bin:/Users/schof/py/scripts:/usr/X11R6/bin"

Аналогично, вывод «C-h v exec-path» выглядит правильно:

("/usr/bin" "/bin" "/usr/sbin" "/sbin" "/usr/local/bin" "/usr/local/git/bin" "/usr/X11/bin" "/Users/schof/py/scripts" "/Applications/Emacs.app/Contents/MacOS/libexec" "/Applications/Emacs.app/Contents/MacOS/bin" "/usr/X11R6/bin")

Это оставляет меня без дальнейших идей о том, как я должен решить это. Я ни в коем случае не гуру Emacs, поэтому, возможно, я упускаю что-то очевидное здесь; не стесняйтесь спрашивать более подробную информацию.

OS X 10.6.7; Углерод Emacs 22.3.1; Пилинт 0.23.0.

Код Flymake / Pylint от .emacs:

  (when (load "flymake" t)
      (defun flymake-pylint-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 "epylint" (list local-file))))

      (add-to-list 'flymake-allowed-file-name-masks
               '("\\.py\\'" flymake-pylint-init)))


;; Auto-start flymake-mode when you go into python-mode
(add-hook 'python-mode-hook
          '(lambda ()
                   (setq python-indent 4)
                   (flymake-mode)))

Обновление 2011-04-05 в ответ на ответ @ sanityinc:

Детализация уровня 3 многословия от flymake в *messages*: (Это не делает источник проблемы очевидным для меня.)

starting syntax check as new-line has been seen
flymake is running: nil
file /Users/schof/pytest.py, init=flymake-pylint-init [3 times]
create-temp-inplace: file=/Users/schof/pytest.py temp=/Users/schof/pytest_flymake.py
saved buffer pytest.py in file /Users/schof/pytest_flymake.py
started process 3221, command=(epylint pytest_flymake.py), dir=/Users/schof/
received 704 byte(s) of output from process 3221
file /Users/schof/pytest.py, init=flymake-pylint-init
parsed 'Traceback (most recent call last):', no line-err-info
parse line: file-idx=2 line-idx=3 file=/Users/schof/py/scripts/epylint line=4 text=in <module>
get-real-file-name: file-name=/Users/schof/py/scripts/epylint real-name=~/py/scripts/epylint
parsed '  File "/Users/schof/py/scripts/epylint", line 4, in <module>', got line-err-info
parsed '    import pkg_resources', no line-err-info
parse line: file-idx=2 line-idx=3 file=/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py line=2556 text=in <module>
get-real-file-name: file-name=/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py real-name=/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py
parsed '  File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 2556, in <module>', got line-err-info
parsed '    working_set.require(__requires__)', no line-err-info
parse line: file-idx=2 line-idx=3 file=/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py line=620 text=in require
get-real-file-name: file-name=/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py real-name=/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py
parsed '  File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 620, in require', got line-err-info
parsed '    needed = self.resolve(parse_requirements(requirements))', no line-err-info
parse line: file-idx=2 line-idx=3 file=/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py line=518 text=in resolve
get-real-file-name: file-name=/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py real-name=/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py
parsed '  File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/pkg_resources.py", line 518, in resolve', got line-err-info
parsed '    raise DistributionNotFound(req)  # XXX put more info here', no line-err-info
parsed 'pkg_resources.DistributionNotFound: pylint==0.23.0', no line-err-info
file /Users/schof/pytest.py, init=flymake-pylint-init
process 3221 exited with code 1
cleaning up using flymake-simple-cleanup
deleted file /Users/schof/pytest_flymake.py
created an overlay at (1-18)
pytest.py: 4 error(s), 0 warning(s) in 0.47 second(s)

Для сравнения, вот вывод из многословия flymake 3 при запуске из emacs текстовый режим . Файл "Hello World" прошел все тесты Pylint.

starting syntax check as new-line has been seen                                                                         
flymake is running: nil                                                                                                 
file /Users/schof/pytest.py, init=flymake-pylint-init [3 times]                                                         
create-temp-inplace: file=/Users/schof/pytest.py temp=/Users/schof/pytest_flymake.py                                    
saved buffer pytest.py in file /Users/schof/pytest_flymake.py                                                           
started process 3395, command=(epylint pytest_flymake.py), dir=/Users/schof/                                            
file /Users/schof/pytest.py, init=flymake-pylint-init                                                                   
process 3395 exited with code 0                                                                                         
cleaning up using flymake-simple-cleanup                                                                                
deleted file /Users/schof/pytest_flymake.py                                                                             
pytest.py: 0 error(s), 0 warning(s) in 0.30 second(s) 

1 Ответ

2 голосов
/ 06 апреля 2011

Чтобы более четко увидеть, что происходит, увеличьте уровень регистрации мухи, а затем посмотрите на *messages*:

(setq flymake-log-level 3)

Без этой информации я бы не стал рассуждать о вероятной проблеме.

Есть хитрость, чтобы избежать подхода environment.plist, кстати;вы можете заставить Emacs запросить у вашей обычной оболочки предпочитаемый PATH:

(defun set-exec-path-from-shell-PATH ()
  (let ((path-from-shell (replace-regexp-in-string
                          "[ \t\n]*$"
                          ""
                          (shell-command-to-string "$SHELL --login -i -c 'echo $PATH'"))))
    (setenv "PATH" path-from-shell)
    (setq exec-path (split-string path-from-shell path-separator))))

(when (and window-system (eq system-type 'darwin))
  ;; When started from Emacs.app or similar, ensure $PATH
  ;; is the same the user would see in Terminal.app
  (set-exec-path-from-shell-PATH))

(Это взято из моей конфигурации Emacs , в которой есть куча кода flymake, включая конфигурациюдля python, используя pyflakes, так что вы можете посмотреть.)

Обновление : Теперь, когда вы добавили подробный вывод, я вижу, что ваш ~ / py / epylintПрограмма не может найти pkg_resources, что указывает на неправильность PYTHONPATH.Итак, используя вариант вышеописанной техники, попробуйте это:

(defun setenv-from-shell (varname)
  (setenv varname (replace-regexp-in-string
                   "[ \t\n]*$"
                   ""
                   (shell-command-to-string (concat "$SHELL --login -i -c 'echo $" varname "'")))))

(setenv-from-shell "PYTHONPATH")
...