【问题标题】:iruby no bash commands possible in jupyter notebook在 jupyter notebook 中 iruby 没有 bash 命令
【发布时间】:2021-01-05 14:29:47
【问题描述】:

我在我的 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 命令?

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

感谢工程师mnky,我找到了解决方案:

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

使用命令 %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')

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

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

【问题讨论】:

  • 以下也应该可以工作require 'pp'; pp(%x(ls -la)); nil

标签: ruby-on-rails ruby jupyter-notebook jupyter iruby


【解决方案1】:

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

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

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

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

TL;DR 为什么会发生错误

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

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

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

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

文档的最后一行声明

如果您使用“(”、“[”、“{”、“”将其关闭。您可以使用大多数其他非字母数字字符作为百分比字符串分隔符,例如“%”、“|”、“^”等。

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

%%bash%
#=> "bash" 

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

%%bash
pwd 
--EOF--

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

【讨论】:

  • 非常感谢您的回答,但现在我有一个后续问题。命令 %x(ls -ls) 的输出是一个原始字符串,例如换行符 (/n) 不起作用。如果我再次将此与 python notebook %%bash ls -la (或 !ls -la )的行为进行比较,它具有格式良好的输出。在 ruby​​ 下,它只是一个很长的字符串,而不是像终端那样真正可读的输出。是否有其他命令可以获得更好的字符串输出?
  • @F.M.不明白你的意思。 %x(ls -ls).each_line(chomp: true).to_a 返回每​​行的 Array 如果这是您要求的。所以puts %x(ls -ls).each_line(chomp: true).to_a 将像终端一样“查看”,但这条线的返回值将是nil
猜你喜欢
  • 1970-01-01
  • 2020-01-02
  • 2019-11-24
  • 2023-03-29
  • 2019-07-13
  • 1970-01-01
  • 2018-09-30
  • 2018-12-12
  • 2016-12-06
相关资源
最近更新 更多