iruby 在 jupyter 笔记本中无法使用 bash 命令

F.M*_*.M. 5 ruby ruby-on-rails jupyter iruby jupyter-notebook

我在我的 jupyter 笔记本中使用 iruby,内核按预期工作并接受所有类型的 ruby​​ 语法

不幸的是 %%bash 命令会导致错误。因此,在我的笔记本中没有可用的控制台命令。如果我切换回基本的 python 内核,%%bash 命令将按预期工作。

我怎样才能让 bash 命令在 iruby 内核中工作?是否有什么我忘记安装或设置的?

我在 Ubuntu 20.04 中使用以下设置:

我还使用 rvm 来管理我的 ruby​​ 版本。

基本设置

sudo apt install python3-pip python3-dev
sudo -H pip3 install --upgrade pip
sudo -H pip3 install virtualenv
pip install jupyter
Run Code Online (Sandbox Code Playgroud)

安装 iruby

gem install ffi-rzmq
gem install iruby --pre
iruby register --force
Run Code Online (Sandbox Code Playgroud)

设置并启动

rvm use ruby-2.7.2
mkdir ~/ruby_notebook

virtualenv ~/ruby_notebook/ruby_env
source ~/ruby_notebook/ruby_env/bin/activate

jupyter notebook --notebook-dir ~/ruby_notebook
Run Code Online (Sandbox Code Playgroud)

但出现以下错误: 在此输入图像描述

有什么想法可以解决这个问题以便我可以使用 bash 命令吗?

========更新和解决方案======

感谢 Engineersmnky 我找到了解决方案:

就像在 python 笔记本中一样,我想实现以下输出:

python bash 命令

使用命令%x(ls -la)我得到执行,但输出看起来不同,例如

在此输入图像描述

因此,为了获得正确的输出,我添加了以下内容:

%x(ls -la).each_line(chomp: true){|s| p s}
Run Code Online (Sandbox Code Playgroud)

它接近输出,但后面是笔记本中的执行字符串输出。

在此输入图像描述

所以我的最终解决方案,也是为了使执行命令不那么复杂,我现在在笔记本的开头使用一种方法。

def execute_console(input)
  %x(#{input}).each_line(chomp: true){|s| p s}
  return nil
end
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用 Rails 在我的笔记本中执行特殊命令,例如

rails routes
Run Code Online (Sandbox Code Playgroud)

execute_console('rails routes')
Run Code Online (Sandbox Code Playgroud)

输出与预期的一样,没有任何字符串输出。

在此输入图像描述

语法错误也按预期打印出来。

eng*_*nky 2

要在系统级别执行命令,您可以使用以下任意命令:Kernel#system, %x(有关百分比字符串的更多信息,请参阅下文)或Kernel#`(“反引号”)

\n
system(\'pwd\')\n%x(pwd) \n`pwd`\n
Run Code Online (Sandbox Code Playgroud)\n

这些都将在进程中运行并以字符串形式返回输出。

\n

如果您希望命令在单独的进程中运行,您可以使用其他选项,例如IO.popenfork { exec(\'pwd\') }(如果操作系统支持)

\n

TL;DR 为什么会发生错误

\n

现在解释您的实际错误及其发生的原因。

\n

此行正在%%bash被 ruby​​ 解释,并且它正在寻找结束符%。\n%是创建字符串文字的另一种方法(称为“百分比字符串”))。

\n

该语法的有趣之处在于它实际上没有定义的分隔符。(基本上大多数非字母数字都可以打开和关闭)

\n
%{bash}\n#=> "bash" \n%(bash)\n#=> "bash"\n%|bash| \n#=> "bash"\n
Run Code Online (Sandbox Code Playgroud)\n

文档的最后一行指出

\n
\n

如果您使用 \xe2\x80\x9c(\xe2\x80\x9d, \xe2\x80\x9c[\xe2\x80\x9d, \xe2\x80\x9c{\xe2\x80\x9d, \xe2\x80 \x9c<\xe2\x80\x9d 必须用 \xe2\x80\x9c)\xe2\x80\x9d, \xe2\x80\x9c]\xe2\x80\x9d, \xe2\x80\x9c}\ 关闭它分别为 xe2\x80\x9d、\xe2\x80\x9c>\xe2\x80\x9d。您可以使用大多数其他非字母数字字符作为百分比字符串分隔符,例如 \xe2\x80\x9c%\xe2\x80\x9d、\xe2\x80\x9c|\xe2\x80\x9d、\xe2\x80\x9c^ \xe2\x80\x9d 等

\n
\n

在你的情况下%被用作分隔符:例如

\n
%%bash%\n#=> "bash" \n
Run Code Online (Sandbox Code Playgroud)\n

但由于没有关闭%这被解释为:

\n
%%bash\npwd \n--EOF--\n
Run Code Online (Sandbox Code Playgroud)\n

因此,您收到的错误是因为String("bash\\npwd ) 未终止。

\n