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?
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 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.
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.
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.
Antworten:
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-library
ich die Quelle von überprüftob-ruby
, die diesen Code enthält:Ich habe Referenzen für Python an anderer Stelle gesehen
org-babel-python-command
, daher gibt es diese in einigen anderen Sprachenob-$lang
.Dies ermöglicht Folgendes:
Dies könnte mit
:session python3
und 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.quelle
org-babel-post-tangle-hook
. Jemand sollte das umsetzenorg-babel-pre-tangle-hook
.:interpreter
Eigenschaft zu benötigen .:interpreter
macht Sinn. Läuft aberorg-babel-post-tangle-hook
nach der Codeausführung überC-c C-c
in einem Codeblock. Ich gehe davon aus,pre
dass vor der Codeausführung ausgeführt würde. Aber mir ist jetzt klar, dass das Ändern einer globalen Variablen schlimme Nebenwirkungen hätte.:interpreter
wäre besser.:interpreter
Option hinzuzufügenorg-babel-execute:js
. Aber als ich dann die Quelle durchging, stellteorg-babel-execute:js
ich fest, dass es bereits eine:cmd
Option gibt, die genau das tut, was ich will. Leider:cmd
ist nicht für alle Sprachen verfügbar und ich habe auch keine Dokumentation dafür gefunden,ob-js
so dass ich anfangs die:cmd
Existenz verpasst habe .: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:cmd
zur Lösung des Problems für diejenigen zeigt, bei denen dieses Problem in Zukunft auftritt?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.
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.quelle
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
:cmd
Option verwenden.Der Standard-JS-Interpreter ist
node
wie in der Variablen definiertorg-babel-js-cmd
. Um einen bestimmten Codeblock über einen anderen Interpreter auszuführen, übergeben Sie die:cmd
Option wie im folgenden Beispiel.quelle