Org Babel中特定于代码块的解释器


13

通过在代码块的顶部指定不同的选项,是否可能在同一个组织文件中拥有两个使用相同语言的代码块,它们在不同的解释器中运行?


2
例如,您是指安装的软件的不同版本,例如python26,python27和python3吗?还是只是唯一的python会话,但全部都使用相同的可执行文件?@dgtized解释了后者。
mankoff 2014年

2
我的意思是安装软件的版本不同,即使用不同的可执行文件。
cefstat 2014年

Answers:


10

原始问题已修改为涉及运行可执行文件的多个版本,而不仅仅是运行独立的解释器。

使用,find-library我检查的源ob-ruby,其中包括以下代码:

(defvar org-babel-ruby-command "ruby"
  "Name of command to use for executing ruby code.")

我在其他地方已经看到了python使用的参考org-babel-python-command,因此它在其他一些语言中也存在,请查看相应的ob-$lang支持以进行查看。

这样可以进行以下工作:

#+begin_src emacs-lisp :results none
(setq org-babel-python-command "python3")
#+end_src

#+begin_src python :results output
import sys
print(sys.version)
#+end_src

#+RESULTS:
: 3.4.0 (default, Apr 11 2014, 13:05:11) 
: [GCC 4.8.2]

#+begin_src emacs-lisp :results none
(setq org-babel-python-command "python2")
#+end_src

#+begin_src python :results output
import sys
print(sys.version)
#+end_src

#+RESULTS:
: 2.7.6 (default, Mar 22 2014, 22:59:56) 
: [GCC 4.8.2]

可以将其:session python3与结合使用:session python2以避免在每个块之前调用elisp。似乎确实应该有一种更简单的方法来执行此操作。


2
有一个org-babel-post-tangle-hook。有人应该在实施org-babel-pre-tangle-hook
mankoff 2014年

1
我对内部结构不是很熟悉,但是我不确定缠结是否是进行此更改的适当阶段?老实说,似乎该区块需要一个:interpreter属性。
dgtized 2014年

2
我也不是很熟悉。是的:interpreter,有道理。但是在代码块中org-babel-post-tangle-hook通过代码执行后运行C-c C-c。我假设pre会在代码执行之前运行。但是我现在意识到,如果更改全局变量,则会产生不良影响。:interpreter会更好。
mankoff 2014年

1
谢谢@dgtized和@mankoff的回答。他们为我指明了正确的方向。我没有指定自己对javascript代码感兴趣是我的错误。根据您的回答,我决定在中添加一个:interpreter选项org-babel-execute:js。但是,从源头开始,org-babel-execute:js我发现已经有一个:cmd选项可以完全满足我的需求。不幸的是,:cmd并非所有语言都可用,并且我也没有找到任何文档,ob-js因此我最初错过了它:cmd的存在。
cefstat

我注意到了@cefstat :cmd,但它似乎仅用于将参数附加到解释器命令。您能否用一个完整的示例来回答您自己的问题,该示例向:cmd将来有此问题的人展示使用来解决该问题?
dgtized

1

我相信默认情况下,即使每个块都使用相同的语言,也都在独立的解释器中运行。对于某些语言,其行为可能有所不同。例如,我不确定emacs-lisp块是否支持session属性。

#+BEGIN_SRC ruby
  a = "foo"
#+END_SRC

#+RESULTS:
: foo

#+BEGIN_SRC ruby
  a ||= "bar"
#+END_SRC

#+RESULTS:
: bar

#+BEGIN_SRC ruby :session foo
  a ||= "session foo"
#+END_SRC

#+RESULTS:
: session foo

#+BEGIN_SRC ruby :session foo
  a += " with bar"
#+END_SRC

#+RESULTS:
: session foo with bar

前两个块使用独立的解释器,但是第三个和第四个块共享一个session :foo,因此它们在同一解释器中求值。


2
理论上很好的答案,但不能回答问题。
mankoff 2014年

1

事实证明,几乎所有Org Babel支持的语言都没有针对特定代码块使用其他解释器的选项。Javascript是一个值得注意的例外(也是我感兴趣的例外)。在这种情况下,可以使用该:cmd选项。

node在变量中定义了标准的JS解释器org-babel-js-cmd。要通过其他解释器运行特定的代码块,请通过:cmd以下示例传递选项。

#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.