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 笔记本中一样,我想实现以下输出:
使用命令%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)
输出与预期的一样,没有任何字符串输出。
语法错误也按预期打印出来。
要在系统级别执行命令,您可以使用以下任意命令:Kernel#system, %x(有关百分比字符串的更多信息,请参阅下文)或Kernel#`(“反引号”)
system(\'pwd\')\n%x(pwd) \n`pwd`\nRun Code Online (Sandbox Code Playgroud)\n这些都将在进程中运行并以字符串形式返回输出。
\n如果您希望命令在单独的进程中运行,您可以使用其他选项,例如IO.popen或fork { exec(\'pwd\') }(如果操作系统支持)
TL;DR 为什么会发生错误
\n现在解释您的实际错误及其发生的原因。
\n此行正在%%bash被 ruby 解释,并且它正在寻找结束符%。\n%是创建字符串文字的另一种方法(称为“百分比字符串”))。
该语法的有趣之处在于它实际上没有定义的分隔符。(基本上大多数非字母数字都可以打开和关闭)
\n%{bash}\n#=> "bash" \n%(bash)\n#=> "bash"\n%|bash| \n#=> "bash"\nRun Code Online (Sandbox Code Playgroud)\n文档的最后一行指出
\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
在你的情况下%被用作分隔符:例如
%%bash%\n#=> "bash" \nRun Code Online (Sandbox Code Playgroud)\n但由于没有关闭%这被解释为:
%%bash\npwd \n--EOF--\nRun Code Online (Sandbox Code Playgroud)\n因此,您收到的错误是因为String("bash\\npwd ) 未终止。
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |