Pylint不能在osx上使用emacsgui;可以从commandlin工作

2024-06-01 08:59:22 发布

您现在位置:Python中文网/ 问答频道 /正文

从命令行(emacs filename.py)运行时,flymake和pylint可以完美地协同工作。错误会正确突出显示。(虽然我无法悬停工具提示来获取错误详细信息,因为它是文本模式。)

当从GUI(carbonemacs)运行时,Flymake立即返回,文件中的第一行将突出显示错误“in <module>”。第一行显示错误,即使在“Hello World”脚本上也是如此。)我想让它在GUI模式下正常工作,这样我就可以用鼠标导航(我知道,我知道),并使用工具提示来获取pylint报告的错误的详细信息。在

我用“easy_install pylint”安装了pylint,pylint和epylint脚本在“~/py/scripts”中。我将该目录添加到我的.bashrc中的路径:

export PATH=$PATH:~/py/scripts

(My.profile是My.bashrc的符号链接。)

我意识到EmacsGUI没有从.bashrc加载路径,所以我创建了一个~/.MacOSX/环境.plist文件,用我在终端中看到的完整路径设置PATH变量。在

现在在Emacs GUI“(getenv "PATH")”中,输出显示正确:

^{pr2}$

类似地,“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的专家,所以我可能遗漏了一些显而易见的东西;请随时询问更多细节。在

苹果操作系统X 10.6.7;Carbon Emacs 22.3.1;pylint 0.23.0。在

来自.emacs的Flymake/Pylint代码:

  (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,回应@santiyinc的回答:

*messages*中flymake的详细级别3输出:(这对我来说问题的根源并不明显。)

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)

作为比较,以下是从emacs文本模式下运行时flymake verbosity 3的输出。“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) 

Tags: nameinpyinitpytestlinelibrarypkg
1条回答
网友
1楼 · 发布于 2024-06-01 08:59:22

要更清楚地了解出了什么问题,请增加flymake的日志级别,然后查看*messages*

(setq flymake-log-level 3)

如果没有这些信息,我就不会猜测可能的问题。在

有一个技巧可以避免environment.plist方法,顺便说一句;您可以让Emacs向您的常规shell请求您的首选路径:

^{pr2}$

(这是从my Emacs config中提取的,其中有一堆flymake代码,包括使用pyflakes的python配置,所以您可能想看看。)

Update:既然您已经添加了详细的输出,我发现您的~/py/epylint程序找不到pkg_resources,这表明{}是错误的。因此,使用上述技术的变体,尝试一下:

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

相关问题 更多 >