我想将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,我需要更改什么?
答案 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)
替换:
env = dict(line.split('=', 1) for line in lines)
<{1>}中的
~/.config/sublime-text-3/Packages/SublimeREPL/repls/subprocess_repl.py
(感谢@MichaelOhlrogge提供更短的语法)
就我而言,登录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
实现!)