Codeblockspezifischer Interpreter in Org Babel


13

Ist es möglich, in derselben Organisationsdatei zwei Codeblöcke in derselben Sprache zu haben, die in verschiedenen Interpretern ausgeführt werden, indem am oberen Rand des Codeblocks verschiedene Optionen angegeben werden?


2
Meinen Sie zum Beispiel verschiedene Versionen der installierten Software, zum Beispiel python26, python27 und python3? Oder nur einmalige Python-Sessions, aber alle mit derselben ausführbaren Datei? @dgtized erklärt letzteres.
mankoff

2
Ich meine verschiedene Versionen der installierten Software, dh mit verschiedenen ausführbaren Dateien.
Cefstat

Antworten:


10

Die ursprüngliche Frage wurde dahingehend geändert, dass mehrere Versionen einer ausführbaren Datei ausgeführt werden und nicht nur unabhängige Interpreter.

Unter Verwendung von habe find-libraryich die Quelle von überprüft ob-ruby, die diesen Code enthält:

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

Ich habe Referenzen für Python an anderer Stelle gesehen org-babel-python-command, daher gibt es diese in einigen anderen Sprachen ob-$lang.

Dies ermöglicht Folgendes:

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

Dies könnte mit :session python3und kombiniert werden :session python2, um einen Aufruf von elisp vor jedem Block zu vermeiden. Es scheint jedoch, dass es einen einfacheren Weg geben sollte, dies zu tun.


2
Es gibt eine org-babel-post-tangle-hook. Jemand sollte das umsetzen org-babel-pre-tangle-hook.
mankoff

1
Ich bin nicht sehr vertraut mit den Interna, aber ich bin mir nicht sicher, ob Verwirrung die geeignete Phase wäre, um diese Änderung vorzunehmen? Ehrlich gesagt scheint der Block eine :interpreterEigenschaft zu benötigen .
22.

2
Ich bin auch nicht so vertraut damit. Ja :interpretermacht Sinn. Läuft aber org-babel-post-tangle-hooknach der Codeausführung über C-c C-cin einem Codeblock. Ich gehe davon aus, predass vor der Codeausführung ausgeführt würde. Aber mir ist jetzt klar, dass das Ändern einer globalen Variablen schlimme Nebenwirkungen hätte. :interpreterwäre besser.
mankoff

1
Vielen Dank an @dgtized und @mankoff für Ihre Antworten. Sie wiesen mich in die richtige Richtung. Es war mein Fehler, dass ich nicht angegeben hatte, dass ich mich für Javascript-Code interessiere. Aufgrund Ihrer Antworten habe ich beschlossen, eine :interpreterOption hinzuzufügen org-babel-execute:js. Aber als ich dann die Quelle durchging, stellte org-babel-execute:jsich fest, dass es bereits eine :cmdOption gibt, die genau das tut, was ich will. Leider :cmdist nicht für alle Sprachen verfügbar und ich habe auch keine Dokumentation dafür gefunden, ob-jsso dass ich anfangs die :cmdExistenz verpasst habe .
Cefstat

@cefstat habe ich notiert :cmd, aber es sah so aus, als würde es nur zum Anhängen von Argumenten an den Interpreter-Befehl verwendet. Könnten Sie bitte Ihre eigene Frage anhand eines vollständigen Beispiels beantworten, das die Verwendung von :cmdzur Lösung des Problems für diejenigen zeigt, bei denen dieses Problem in Zukunft auftritt?
24.

1

Ich glaube, dass standardmäßig jeder Block in einem unabhängigen Interpreter ausgeführt wird, auch wenn es sich um dieselbe Sprache handelt. Das Verhalten kann für einige Sprachen unterschiedlich sein. Ich bin mir zum Beispiel nicht sicher, ob Emacs-Lisp-Blöcke die Session-Eigenschaft unterstützen.

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

Die ersten beiden Blöcke verwenden unabhängige Interpreter, der dritte und vierte Block teilen sich jedoch eine Sitzung :foo, sodass sie im selben Interpreter auswerten.


2
Theoretisch eine gute Antwort, aber sie beantwortet die Frage nicht.
mankoff

1

Es stellt sich heraus, dass es für fast alle von Org Babel unterstützten Sprachen keine Möglichkeit gibt, einen anderen Interpreter für einen bestimmten Codeblock zu verwenden. Eine bemerkenswerte Ausnahme (und die, die mich interessiert) ist Javascript. In diesem Fall kann man die :cmdOption verwenden.

Der Standard-JS-Interpreter ist nodewie in der Variablen definiert org-babel-js-cmd. Um einen bestimmten Codeblock über einen anderen Interpreter auszuführen, übergeben Sie die :cmdOption wie im folgenden Beispiel.

#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.