Babelでのipythonの動作設定


7

誰かがIPythonでbabelを使用するための実際の設定を教えてもらえますか?

関数を定義しようとすると、奇妙なインデント動作が見られます。これは、で--classicフラグを指定したかどうかに関係なく発生しますorg-babel-python-command。私の現在のコマンド(Emacs 24.4でLinuxを実行):

(setq org-babel-python-command 
      "ipython --pylab=qt4 --pdb --nosep --classic --no-banner --no-confirm-exit")

これは関数定義では機能しません。

#+BEGIN_SRC python :session *Broken IPython* :results output pp
  def g(x, lst):
      if isinstance(x, float):
          x = x + 0
      return [item + x for item in lst]
#+END_SRC

私のipythonバッファーのスクリーンショット

--classic私は同じエラーを受け取るので、これはどちらにも関連していないようです:

私の最新のipythonバッファーのスクリーンショット

--classic「モダン」インターフェースのフォーマットが好きなので、使用を強制しない動作設定がある場合のボーナスポイント。

更新

magicコマンドを使用すると、関数を定義してセッションを評価できますが、値なしでは値を出力できません。代わりに、私は得ます:

#+BEGIN_SRC python :results output
   def f(x):
       return x + 2

   f(2)
#+END_SRC

#+RESULTS:
: >>> ... ... >>> 4
: >>> 

#+BEGIN_SRC python :results value
   def f(x):
       return x + 2

   f(2)
#+END_SRC

#+RESULTS:

結果のすべてが>>>正しく解析されていないため、結果は返されません。


:results value明示的なreturnステートメントを追加するか、変数に割り当ててヘッダーにfoo追加:return fooすることにより、Pythonコードを変更する必要があるため、「更新」の2番目のブロックは機能しません。しかし、それらの修正があってもipythonでは機能しません-以下の私の回答に対する2番目のコメントを参照してください。
2014

回答:


2

問題は、コードをipythonセッションに直接貼り付けることができないことです。組織のメーリングリストにポストアルンPersaudによっては採用していますこの問題を回避する%cpaste魔法のコマンドを。これは少し簡略化されたバージョンです:

#+BEGIN_SRC emacs-lisp
; use %cpaste to paste code into ipython in org mode
(defadvice org-babel-python-evaluate-session
  (around org-python-use-cpaste
         (session body &optional result-type result-params) activate)
  "add a %cpaste and '--' to the body, so that ipython does the right thing."
  (setq body (concat "%cpaste -q \n" body "\n--"))
  ad-do-it
  )
#+END_SRC

上記を評価した後、defadviceあなたの例は私のために働きます。とはいえ、下位シェルにipythonを使用する利点は何ですか?バベルを使用している場合は、シェルと直接やり取りすることはないでしょう。


インタラクティブなグラフィックスにpylabを使用していることに気付いたので、ipythonはそれで意味があると思います。
2014年

1
これはサンプルセッションを修正します。これはすばらしいことですが、セッションなしでは機能しません。更新された質問をご覧ください。
wdkrnls 2014

@wdkmlsうーん、セッションがないと、IPythonを使用する動機はさらに弱くなります。これは、コードブロックの評価ごとに個別のIPythonプロセスを開始することを意味し、非常に低速です。本当にそのルートをたどりたい場合org-babel-python-evaluate-external-processは、出力をクリーンアップするためにアドバイスをまとめる必要があります。これは本当に必要ですか?
2014

今は違うと思います。最終的にはEmacsスプレッドシートでpython関数を使用したいのですが、今のところシェルスクリプトで目的の機能をラップできると思います。
wdkrnls 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.