spacemacs python layer 无法补全os module,提示 not enough values to unpack (expected 1, got 0)

在Python mode 下 import os

无法补全os module
报错: 但是其他的module可以补全 我使用的是pyenv的虚拟环境 Python版本是3.6.2

在idle下可以使用os module

这个是已知的 anaconda-mode 的 bug:

目前尚未解决

话说 @ashfinal 你不是因为这个放弃 emacs 的吧?

  • 提问之前先尝试 google 查找有没有别人遇到/解决过类似问题

  • 大部分时候,你发到论坛,也是其他人帮你 google :joy:,所以尽量贴错误信息文字,而不是截图

  • 这是我 google 到的 https://github.com/davidhalter/jedi/issues/873 里边声称已经解决了,我非 spacemacs 用户,无法帮你验证。你可以:

    • 删掉旧的 package,重新下载
    • 精减配置,只保留 python 相关
    • 必要时把精减后的配置发出来,让其他人可以很容易重现问题

重复 anaconda_mode 无法补全 os 模块?

2 个赞

原来是 jedi 的 bug,不过好像还未解决。那个 issue 里有人给出了隐藏这个错误的方法,但是作者有其它 priority,所以还没有 fix。

虽然很尬,但是真的就是这样。

1 个赞

我试了一下这段代码:

import jedi
s = jedi.Script('''import os
os.''', 2, len('os.'))
s.completions()
for c in s.completions():
  print(c.name, c.full_name)

full_name 出问题了,那个 patch 的我没去验证,也可以不必等 fix,降级暂时避开这个问题:

$ pip install jedi==0.9.0

@asteryond @ashfinal


降级之后 jedi 是没有这个问题的,但是 spacemacs 的配置是否兼容我不确定。

不用降级,那个 fix 可以用。

图片

那个 fix 只用了一个 try except 就搞定了 :joy:

链接在这:

这个PR还没有提交,不过很简单,手动修改足矣

2 个赞

虽然这个问题以前提过,但是还得谢谢楼主提出。

多谢 @twlz0ne 指出的链接,避免了我踩大坑,谢谢!

@asteryond 啊哈,和我同样的问题,当时折腾了我好几天。

使用 @twlz0ne 提到的方法(包括但不限于,总之很折腾),最终确定就是 anaconda-mode 的锅。

终于可以到 repo 提 issue 了!……不过到现在,难以说这个问题已被完美解决。

@et2010 提到的那个 fix,当时我也试过。倒是不报错了,但是 os 模块也不能完成,不清楚你截图里的完成菜单是怎么弹出来的……真是灵异啊 (#゚Д゚)

降级 jedi 版本这个方法,我倒是没试过,楼主可以试一下。

@et2010 倒不是放弃 emacs,只是热情没那么大,不怎么折腾了。

同样,对于其它编辑器也没怎么花时间折腾。比如 Vim 接触时间比 emacs 早多了,到现在对 Vimscript 还是基本一窍不通的状态。当然,Vim 也不是全能的,不过我个人不介意电脑上装多个编辑器,也不介意一项工作需要多个编辑器完成。嗯,我是个没有信仰的人。:laughing:

你是不是改错文件了?我用 Locate 找到文件系统里有多个 jedi,anaconda-mode 自动安装的是其中之一。但是改那个没有用。因为我用的虚拟环境,我把虚拟环境里安装的 jedi 改了就 OK 了,完美补全,不需要任何其它操作。

但是你说不报错了是怎么回事?你确定装的是 jedi 0.10.2?确实很灵异 :confused:

我没有用虚拟环境,改的是 anaconda-mode 安装在自个儿路径下的 jedi。即使如此为了防止可能的冲突,我确定没有全局安装过 anaconda-mode 三个依赖包里的任何一个。从我贴的 log 也能看出执行路径:

Traceback (most recent call last):
  File "/Users/ashfinal/.emacs.d/.cache/anaconda-mode/0.1.8/jedi/api/classes.py", line 161, in to_reverse
module_context, = name.infer()

anaconda-mode 调用的是自身目录里的 jedi,改全局安装的或者虚拟环境里的 jedi 应该是不起作用的。要么是 Linux 和 macOS 下 anaconda-mode 的行为方式不同,要么真是灵异事件?:joy:

你可以看一下你的 python 补全是不是由其它插件提供的?

鉴于我的 emacs 没安装几个插件,就不再试了。话说楼主跑哪去了?赶紧反馈下也好。

不报错的意思是:那个所谓 fix 他 try except 括住的东西,正是产生完成列表的代码。这个错误只是被抑制了,而没有处理掉,os 模块还是无法自动补全。作为临时的 workaround 是可以的,但这样的 PR (如果能叫 PR 的话)不可能被 merge 进 jedi 代码主干。

但是那个确实是 anaconda/jedi 的补全,我试了把其它的后端都关闭了,仍然可以显示。

我也很奇怪一个 try except 怎么就把问题给解决了,一开始我的想法和你一样,所以专门加了 company-capf 作为 comapny-anaconda 的补充。但是发现有重复条目,所以就把 capf 去掉了,只剩 anaconda,发现仍然可以补全。

@et2010 @ashfinal try...expect 只是忽略了部分出错的路径,运行这段代码就清楚了:

s = jedi.Script('''import os
os.''', 2, len('os.'))

for item in s.completions():
    try:
        item.full_name
    except Exception as e:
        print(item.name, item.type, e)

结果:

('ce', 'module', ValueError('need more than 0 values to unpack',))
('link', 'module', ValueError('need more than 0 values to unpack',))
('nt', 'module', ValueError('need more than 0 values to unpack',))
('os2', 'module', ValueError('need more than 0 values to unpack',))
('path', 'module', ValueError('need more than 0 values to unpack',))
('riscos', 'module', ValueError('need more than 0 values to unpack',))
('_exit', 'module', ValueError('need more than 0 values to unpack',))

出错的是 module 这一类属性,把这些去掉了,其它的保留。所以补全还是有的,但是不完整,如果看不到补全,就是 Emacs 配置的问题了。

import jedi

source = '''
import os
os.'''

script = jedi.Script(source, 3, len('os.'), 'example.py')

script.completions()

:zipper_mouth_face: 害得我跑去看 jedi 的文档,在示例代码上略有修改。http://jedi.readthedocs.io/en/latest/

其实个人觉得问题挺明确的:我电脑上安装的其它编辑器如 ST3、Vim、Atom、VSCode 的 python 补全全都用的是 jedi 库,而它们均运行良好,也没要求把 jedi 版本降级。那么问题出在谁身上,还是比较了然的吧。

也许它们用的是不同版本的 jedi 呢?0.9 和 0.10 好像都没有问题。这个问题好像不是 emacs specific

╮(╯_╰)╭ 完全看不懂楼上上在说什么

@et2010 VSCode 用的 python-protocol-server 依赖就是 jedi 0.10.2 版本。其它编辑器我一会再看一下。

ST3 python 补全插件:Anaconda。jedi 版本是 0.10.3。这个很奇怪,正式版本只到 0.10.2 版,难道是开发版或者魔改的版本?

Atom 插件:autocomplete-python。jedi 版本是 0.10.0。

这些版本无一例外没有用 try except 的 fix,如果真那么“fix”的话,恐怕 os.path 这样的也就无法补全了。

@twlz0ne 我例子举的不好,没有看到你说的 “full_name”,不过这也不能说明是 jedi 的锅。我再看看

经测试可以补全 os.path

我的意思是这是 jedi 的锅,不是 emacs 的锅