在Python mode 下 import os
无法补全os module报错: 但是其他的module可以补全 我使用的是pyenv的虚拟环境 Python版本是3.6.2
在idle下可以使用os module
在Python mode 下 import os
无法补全os module在idle下可以使用os module
提问之前先尝试 google 查找有没有别人遇到/解决过类似问题
大部分时候,你发到论坛,也是其他人帮你 google ,所以尽量贴错误信息文字,而不是截图
这是我 google 到的 ValueError: not enough values to unpack (expected 1, got 0) · Issue #873 · davidhalter/jedi · GitHub 里边声称已经解决了,我非 spacemacs 用户,无法帮你验证。你可以:
原来是 jedi 的 bug,不过好像还未解决。那个 issue 里有人给出了隐藏这个错误的方法,但是作者有其它 priority,所以还没有 fix。
虽然很尬,但是真的就是这样。
我试了一下这段代码:
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
降级之后 jedi 是没有这个问题的,但是 spacemacs 的配置是否兼容我不确定。
不用降级,那个 fix 可以用。
那个 fix 只用了一个 try except 就搞定了
链接在这:
这个PR还没有提交,不过很简单,手动修改足矣
@asteryond 啊哈,和我同样的问题,当时折腾了我好几天。
使用 @twlz0ne 提到的方法(包括但不限于,总之很折腾),最终确定就是 anaconda-mode
的锅。
终于可以到 repo 提 issue 了!……不过到现在,难以说这个问题已被完美解决。
@et2010 提到的那个 fix,当时我也试过。倒是不报错了,但是 os
模块也不能完成,不清楚你截图里的完成菜单是怎么弹出来的……真是灵异啊 (#゚Д゚)
降级 jedi
版本这个方法,我倒是没试过,楼主可以试一下。
@et2010 倒不是放弃 emacs,只是热情没那么大,不怎么折腾了。
同样,对于其它编辑器也没怎么花时间折腾。比如 Vim 接触时间比 emacs 早多了,到现在对 Vimscript 还是基本一窍不通的状态。当然,Vim 也不是全能的,不过我个人不介意电脑上装多个编辑器,也不介意一项工作需要多个编辑器完成。嗯,我是个没有信仰的人。
你是不是改错文件了?我用 Locate 找到文件系统里有多个 jedi,anaconda-mode 自动安装的是其中之一。但是改那个没有用。因为我用的虚拟环境,我把虚拟环境里安装的 jedi 改了就 OK 了,完美补全,不需要任何其它操作。
但是你说不报错了是怎么回事?你确定装的是 jedi 0.10.2?确实很灵异
我没有用虚拟环境,改的是 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
的行为方式不同,要么真是灵异事件?
你可以看一下你的 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()
害得我跑去看 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 的锅