gpt4 book ai didi

python - Pylint 不能在 OS X 上使用 Emacs GUI;从命令行工作

转载 作者:太空宇宙 更新时间:2023-11-03 11:35:17 24 4
gpt4 key购买 nike

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

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

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

export PATH=$PATH:~/py/scripts

(我的 .profile 是我的 .bashrc 的符号链接(symbolic link)。)

我意识到 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; 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 以回应@sanityinc 的回答:

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

最佳答案

为了更清楚地看到出了什么问题,提高flymake的日志级别,然后查看*messages*:

(setq flymake-log-level 3)

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

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

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

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

更新:现在您已经添加了详细输出,我看到您的 ~/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")

关于python - Pylint 不能在 OS X 上使用 Emacs GUI;从命令行工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5543989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com