Org Babel의 코드 블록 특정 인터프리터


13

동일한 조직 파일에서 코드 블록의 맨 위에 다른 옵션을 지정하여 다른 인터프리터에서 실행되는 동일한 언어의 두 개의 코드 블록을 가질 수 있습니까?


2
예를 들어 다른 버전의 설치된 소프트웨어 (예 : python26, python27 및 python3)를 의미합니까? 아니면 유일한 파이썬 세션이지만 모두 동일한 실행 파일을 사용합니까? @dgtized는 후자를 설명합니다.
mankoff

2
다른 버전의 설치된 소프트웨어, 즉 다른 실행 파일을 사용한다는 의미입니다.
cefstat

답변:


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]

이것은 각 블록 전에 elisp 호출 :session python3과 결합 :session python2하여 피할 수 있습니다 . 그래도 더 간단한 방법이 있어야합니다.


2
가 있습니다 org-babel-post-tangle-hook. 누군가에서 구현해야합니다 org-babel-pre-tangle-hook.
mankoff

1
나는 내부에 대해 잘 모르지만 엉킴 이이 변경을 수행하기에 적절한 단계인지 확실하지 않습니까? 솔직히 말해서 블록에 :interpreter속성이 필요한 것 같습니다 .
dgtized

2
나도 그것에 익숙하지 않다. 그렇습니다 :interpreter. 그러나 org-babel-post-tangle-hook코드 실행 후 C-c C-c코드 블록을 통해 실행됩니다 . pre코드 실행 전에 실행 한다고 가정 합니다. 그러나 전역 변수를 변경하면 부작용이 발생한다는 것을 알았습니다. :interpreter더 좋을 것입니다.
mankoff

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 블록이 세션 속성을 지원하는지 확실하지 않습니다.

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

처음 두 블록은 독립 통역사를 사용하지만 세 번째 및 네 번째 블록은 세션을 공유 :foo하므로 동일한 통역사에서 평가됩니다.


2
이론적으로는 좋은 대답이지만 질문에 대답하지는 않습니다.
mankoff

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.