iruby 在 jupyter notebook 中没有 bash 命令

iruby no bash commands possible in jupyter notebook

我在我的 jupyter notebook 中使用 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

正在安装 iruby

gem install ffi-rzmq
gem install iruby --pre
iruby register --force

设置和启动

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

但是出现如下错误:

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

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

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

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

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

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

%x(ls -la).each_line(chomp: true){|s| p s}

接近输出但随后在笔记本中执行 strinfg 输出。

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

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

这样我就可以使用rails在我的笔记本上执行特殊命令,比如

rails routes

execute_console('rails routes')

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

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

要在系统级别执行命令,您可以使用以下任何一种:Kernel#system, %x (see below for more about percent strings), or Kernel#`(“反引号”)

system('pwd')
%x(pwd) 
`pwd`

这些都将 运行 处理并 return 作为字符串输出。

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

TL;DR 为什么会出现错误

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

这一行是 %%bash 正在被 ruby 解释,它正在寻找结束符 %% 是另一种创建字符串文字的方法(称为 "Percent String")。

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

%{bash}
#=> "bash" 
%(bash)
#=> "bash"
%|bash| 
#=> "bash"

文档的最后一行指出

If you are using “(”, “[”, “{”, “<” you must close it with “)”, “]”, “}”, “>” respectively. You may use most other non-alphanumeric characters for percent string delimiters such as “%”, “|”, “^”, etc.

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

%%bash%
#=> "bash" 

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

%%bash
pwd 
--EOF--

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