Org Babelのコードブロック固有のインタープリター


13

コードブロックの上部で異なるオプションを指定することにより、同じインタープリターで実行される同じ言語の2つのコードブロックを同じorgファイルに含めることは可能ですか?


2
たとえば、インストールされたソフトウェアの異なるバージョン、たとえばpython26、python27、python3を意味しますか?または、単にユニークなPythonセッションですが、すべて同じ実行可能ファイルを使用していますか?@dgtizedは後者を説明しています。
マンコフ14年

2
つまり、インストールされたソフトウェアの異なるバージョン、つまり異なる実行可能ファイルを使用することを意味します。
cefstat 14年

回答:


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
マンコフ14年

1
私は内部構造にあまり詳しくありませんが、もつれがこの変更を行うための適切な段階になるかどうかわかりません。正直なところ、ブロックには:interpreterプロパティが必要なようです。
14年

2
私もそれにあまり詳しくありません。はい:interpreter、理にかなっています。ただし、コードブロック内でorg-babel-post-tangle-hookのコード実行後に実行さC-c C-cれます。preコード実行前に実行されると思います。しかし、グローバル変数を変更すると、副作用が生じることに気付きました。:interpreter方が良いだろう。
マンコフ14年

1
あなたの答えを@dgtizedと@mankoffに感謝します。彼らは私に正しい方向を示しました。javascriptコードに興味があると明記していなかったのは私の間違いでした。あなたの答えに基づいて、:interpreterオプションをに追加することにしましたorg-babel-execute:js。しかし、ソースを調べてみると、私が望んでいることを正確にorg-babel-execute:js行う:cmdオプションがすでにあることがわかりました。残念ながら、:cmdすべての言語で利用できるわけではなく、ドキュメントも見つかりませんでしたob-jsので、最初は:cmdの存在を逃しました。
cefstat 14年

@cefstatと書き:cmdましたが、インタプリタコマンドに引数を追加するためだけに使用されているように見えました。:cmd将来この問題を抱えている人のために問題を解決するための使用を示す完全な例であなた自身の質問に答えていただけますか?
14年

1

デフォルトでは、同じ言語であっても、各ブロックは独立したインタープリターで実行されると考えています。一部の言語では動作が異なる場合があります。たとえば、emacs-lispブロックがセッションプロパティをサポートしているかどうかはわかりません。

#+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

最初の2つのブロックは独立したインタープリターを使用しますが、3番目と4番目のブロックはセッションを共有する:fooため、同じインタープリターで評価されます。


2
理論的には良い答えですが、質問には答えません。
マンコフ14年

1

Org Babelでサポートされているほとんどすべての言語には、特定のコードブロックに異なるインタープリターを使用するオプションがないことがわかります。注目すべき1つの例外(および私が興味を持っている例外)は、Javascriptです。この場合、:cmdオプションを使用できます。

標準のJSインタープリターはnode、変数で定義されています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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.