sublimerepl getenv失败

时间:2015-11-11 02:39:53

标签: clojure sublimetext2 sublimetext3 sublimetext

我想将SiblimeREPL软件包与Sublime Text一起使用。当我尝试启动REPL时,我得到了

SublimeREPL: obtaining sane environment failed in getenv()
Check console and 'getenv_command' setting
WARN: Falling back to SublimeText environment

无论我尝试启动哪种REPL,都会发生这种情况。 (我尝试过Ruby,Python和Clojure。)我尝试了Sublime Text 2和Sublime Text 3,结果相同。这是在Mac OS X上,如果这很重要。

我查看了包装设置,我看到了

"getenv_command": ["/bin/bash", "--login", "-c", "env"],

如果我跑" / bin / bash --login -c env"在终端提示符下,我列出了我的环境。

为了获得成功的getenv_command,我需要更改什么?

7 个答案:

答案 0 :(得分:15)

我和ssgam有同样的问题。我的问题在于getenv方法。它调用 subprocess.check_output(getenv_command),它在python 2.6中不存在,ST2似乎使用它。

诀窍是,如果getenv_command是真的,它只调用subprocess.check_output(),否则默认为os.environ.copy()。因此,要在不修改SublimeREPL包的情况下获得ssgam的修复,请在首选项>套餐设置> SublimeREPL>设置 - 用户,执行以下操作:

{
  "getenv_command": false
}

答案 1 :(得分:6)

我更深入地调查了这个问题,似乎SublimeText 3也受到了影响。在我的例子中,问题与bash-completion特性有关,特别是COMP_WORDBREAKS环境变量。

使用以下命令显示COMP_WORDBREAKS的内容:

$ echo "$COMP_WORDBREAKS"

将输出

"'><=;|&(:

您也可以使用:

$ echo $COMP_WORDBREAKS

但请注意,使用第二个命令(不带引号),您将看不到 变量还包含换行符。

这里的问题是换行符,它打破了getenv_command功能中的输出解析。如果您提取SublimeREPL的部分源代码,您可以从python解释器获得真正的错误消息。

Traceback (most recent call last):
  File "main.py", line 71, in getenv
    env = dict(line.split('=', 1)  for line in lines)
ValueError: dictionary update sequence element #6 has length 1; 2 is required

您可以将元素#6与env列表中COMP_WORDBREAKS的位置匹配。

解决方案(首先出现在我的脑海中)

我现在还不知道在应用以下解决方案之后对bash-completion功能有什么真正的影响,当然SublimeREPL当然应该相应地修复。请评论我的答案以填补缺失的知识。

我们可能想删除令人不安的字符以消除错误。 首先让我们识别那些字符

$ echo -n "${COMP_WORDBREAKS}" | od -t x1c

将输出

0000000  20  09  0a  22  27  3e  3c  3b  7c  26  28  3a
             \t  \n   "   '   >   <   ;   |   &   (   :
0000014

所以我们要删除三个。最简单的方法是在以下行添加 .bashrc

COMP_WORDBREAKS="${COMP_WORDBREAKS#???}"

瞧!没有更多错误消息。

我最后的想法是删除字符。我不完全了解bash-completion是如何工作的,我知道修改COMP_WORDBREAKS会影响使用它的其他脚本。现在你可以随时改变它。

我希望这会有所帮助。

干杯

答案 2 :(得分:3)

找到它。固定它。 SublimeREPL假设运行getenv_command将生成运行env的输出SOLELY,并且每一行都将包含一个等号。但我的.bash_profile回复了stdout的一些内容。

解决方案是将我的.bash_profile输出包装在

if [[ $- == *i* ]] 

除执行的命令外不产生额外的输出。

答案 3 :(得分:2)

TLDR;

替换:

env = dict(line.split('=', 1)  for line in lines)
<{1>}中的

~/.config/sublime-text-3/Packages/SublimeREPL/repls/subprocess_repl.py

(感谢@MichaelOhlrogge提供更短的语法)

为什么会这样?

@ develucas的解决方案帮助我解决了我的问题。我没有遇到他所描述的问题,但他的调查有所帮助。

就我而言,登录shell有一个问候语。因此,env = dict(line.split('=', 1) for line in lines if '=' in line) (在bash --login -c env选项下SublimeREPL.sublime-settings文件中指定的命令)打印的内容如下:

getenv_command

事实证明,SublimeREPL使用此命令的输出来加载环境变量 - 如Hello, parth! USER=parth SHELL=/bin/bash . . . 设置上方的注释中所述:

getenv_command

解析此输出的代码是这样的(在ST3的// On POSIX system SublimeText launched from GUI does not inherit // a proper environment. Often leading to problems with finding interpreters // or not using the ones affected by changes in ~/.profile / *rc files // This command is used as a workaround, it's launched before any subprocess // repl starts and it's output is parsed as an environment "getenv_command": ["/bin/bash", "--login", "-c", "env"], 文件中):

~/.config/sublime-text-3/Packages/SublimeREPL/repls/subprocess_repl.py

def getenv(self, settings): """Tries to get most appropriate environent, on windows it's os.environ.copy, but on other system's we'll try get values from login shell""" getenv_command = settings.get("getenv_command") if getenv_command and POSIX: try: output = subprocess.check_output(getenv_command) lines = output.decode("utf-8", errors="replace").splitlines() env = dict(line.split('=', 1) for line in lines) return env except: import traceback traceback.print_exc() error_message( "SublimeREPL: obtaining sane environment failed in getenv()\n" "Check console and 'getenv_command' setting \n" "WARN: Falling back to SublimeText environment") # Fallback to environ.copy() if not on POSIX or sane getenv failed return os.environ.copy() 行导致问题,因为env = dict(line.split('=', 1) for line in lines)输出中的第一行没有bash --login -c env。所以我修改了这一行,忽略了没有=符号的行:

=

这解决了我的问题。修改此文件后,不要忘记重启Sublime Text。

答案 4 :(得分:1)

改变COMP_WORDBREAKS对我不起作用...... 我正在使用ST2,并且在check_output()处抛出异常。

此外,更改COMP_WORDBREAKS后命令行的名称完成失败。

就我而言,我改变了subprocess_repl.py的env()方法:

[wind]$ diff subprocess_repl.py.20151117.173317 subprocess_repl.py
160c160,161
<         updated_env = env if env else self.getenv(settings)
---
>         # updated_env = env if env else self.getenv(settings)
>         updated_env = env if env else os.environ.copy()
[wind]$

有趣的是找出问题突然出现的原因......

HTH,欢呼声,

SAM

答案 5 :(得分:1)

@develucas的回答主要适用于使用OSX El Capitan的ST3,除非我不得不放

export COMP_WORDBREAKS="${COMP_WORDBREAKS#???}"

注意导出。但是,如果我这样做,标签完成将不再有效。

答案 6 :(得分:1)

我遇到了同样的问题,我的.bash_profile有一些实用程序输出,例如欢迎消息等。

这些输出由SublimeREPL解析,尝试从env命令的输出中提取环境变量,并且混合在一起的无关文本行引发错误。

(我想为SublimeREPL做一个PR,试图让这个阶段更健壮,它不应该依赖于特定的.bash_profile实现!)