4

我在我的 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

安装 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 笔记本中我想实现以下输出:

蟒蛇bash命令

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

在此处输入图像描述

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

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

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

在此处输入图像描述

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

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

这样我就可以使用像这样的rails在我的笔记本中执行特殊命令

rails routes

execute_console('rails routes')

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

在此处输入图像描述

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

4

1 回答 1

2

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

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

这些都将在进程中运行并将输出作为字符串返回。

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

TL;DR 为什么会发生错误

现在解释你的实际错误以及它发生的原因。

这条线%%bash正在被 ruby​​ 解释,它正在寻找一个结束%%是创建字符串文字的另一种方式(称为“百分比字符串”)。

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

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

文档的最后一行状态

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

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

%%bash%
#=> "bash" 

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

%%bash
pwd 
--EOF--

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

于 2021-01-06T15:58:29.273 回答