Pylint no funciona con la GUI de Emacs en OS X; trabaja desde la linea de comando

Cuando se ejecuta desde la línea de comandos ( emacs filename.py ), flymake y pylint funcionan perfectamente juntos. Los errores se resaltan correctamente. (Aunque no puedo desplazar la información sobre herramientas para obtener detalles del error porque está en modo texto).

Cuando se ejecuta desde la GUI (Carbon Emacs), Flymake regresa inmediatamente y la primera línea del archivo se resalta con el error ” in “. La primera línea muestra el error incluso en una secuencia de comandos “Hello World”. Me gustaría que funcione correctamente en el modo GUI para poder navegar con el mouse (lo sé, lo sé) y usar información sobre herramientas para obtener detalles. en el pylint informó de errores.

Instalé pylint con ” easy_install pylint “, y los scripts de pylint y epylint están en ” ~/py/scripts “. Agregué ese directorio a mi RUTA en mi .bashrc:

 export PATH=$PATH:~/py/scripts 

(Mi .profile es un enlace simbólico a mi .bashrc.)

Me di cuenta de que Emacs-GUI no estaba cargando la ruta desde mi .bashrc, así que creé un archivo ~ / .MacOSX / environment.plist, configurando la variable PATH con la PATH completa que veo en el terminal.

Ahora en Emacs-GUI ” (getenv "PATH") ” la salida parece correcta:

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

Del mismo modo, la salida de ” Ch v exec-path ” parece correcta:

 ("/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") 

Eso me deja sin más ideas de cómo debo resolver esto. De ninguna manera soy un gurú de Emacs, así que es posible que me esté perdiendo algo obvio aquí; siéntase libre de pedir más detalles.

OS X 10.6.7; Emacs de carbono 22.3.1; pylint 0.23.0.

Código Flymake / Pylint de .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))) 

Actualización 2011-04-05 en respuesta a la respuesta de @sanityinc:

Verbosidad nivel 3 salida de flymake en *messages* : (Esto no hace que el origen del problema sea obvio para mí).

 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  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 ', 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  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 ', 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) 

Para comparación, aquí está la salida de flymake verbosity 3 cuando se ejecuta desde el modo de texto emacs. El archivo “hola mundo” pasó todas las pruebas de 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) 

Para ver más claramente qué está mal, aumente el nivel de registro de flymake, luego mire en *messages* :

 (setq flymake-log-level 3) 

Sin esa información, no especularía sobre el problema probable.

Hay un truco para evitar el enfoque de Environment.plist, BTW; puede hacer que Emacs le pregunte a su shell habitual cuál es su PATH preferido:

 (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)) 

(Eso se ha levantado de mi configuración de Emacs , que tiene un montón de código flymake, incluida una configuración para python usando pyflakes , por lo que es posible que desee echar un vistazo).

Actualización : Ahora que ha agregado la salida detallada, veo que su progtwig ~ / py / epylint no puede encontrar pkg_resources , lo que apunta a que PYTHONPATH está equivocado. Entonces, usando una variación de la técnica anterior, prueba esto:

 (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")