thiết lập làm việc cho ipython trong babel


7

Ai đó có thể chỉ cho tôi một thiết lập hoạt động để sử dụng babel với IPython không?

Tôi đang chứng kiến ​​hành vi thụt đầu dòng lạ khi tôi cố gắng xác định các chức năng. Điều này xảy ra cho dù tôi có chỉ định --classiccờ trong hay không org-babel-python-command. Lệnh hiện tại của tôi (chạy linux với Emacs 24.4):

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

Điều này không làm việc với các định nghĩa chức năng.

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

ảnh chụp màn hình bộ đệm ipython của tôi

Điều này dường như không liên quan đến --classicmột trong hai khi tôi gặp cùng một lỗi:

ảnh chụp màn hình bộ đệm ipython hiện đại của tôi

Điểm thưởng nếu bạn có một thiết lập hoạt động không bắt buộc tôi phải sử dụng --classicvì tôi thích định dạng của giao diện "hiện đại".

Cập nhật

Sử dụng lệnh ma thuật cho phép tôi xác định các chức năng và đánh giá một phiên, nhưng tôi không thể nhận được giá trị đầu ra mà không có. Thay vào đó, tôi nhận được:

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

Không có kết quả nào được trả về, dường như vì tất cả >>>các đầu ra không được phân tích cú pháp chính xác.


Khối thứ hai của "Cập nhật" của bạn sẽ không bao giờ hoạt động vì :results valueyêu cầu bạn sửa đổi mã python của mình bằng cách thêm một returncâu lệnh rõ ràng hoặc bằng cách gán cho một biến foovà thêm :return foovào tiêu đề. Nhưng ngay cả với những sửa chữa đó, nó sẽ không hoạt động trong ipython - xem bình luận thứ hai của tôi cho câu trả lời của tôi dưới đây.
không dùng nữa

Câu trả lời:


2

Vấn đề là bạn không thể trực tiếp dán mã vào phiên ipython. Một bài đăng trong danh sách gửi thư của Org bởi Arun Persaud đưa ra một cách giải quyết sử dụng %cpastelệnh ma thuật. Đây là một phiên bản đơn giản hơn một chút:

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

Sau khi đánh giá ở trên, defadviceví dụ của bạn làm việc cho tôi. Tôi phải hỏi mặc dù, lợi ích của việc sử dụng ipython cho lớp vỏ kém là gì? Nếu bạn đang sử dụng babel, thì chắc chắn bạn sẽ không tương tác trực tiếp với vỏ.


Tôi mới nhận ra rằng bạn đang sử dụng pylab cho đồ họa tương tác, vì vậy tôi đoán ipython có ý nghĩa cho điều đó.
không dùng nữa vào

1
cái này sửa phiên làm việc, rất tốt, nhưng nó không hoạt động nếu không có phiên. Xem câu hỏi cập nhật.
wdkrnls

@wdkmls Hmmm, nhưng không có phiên thì động lực sử dụng IPython dường như còn yếu hơn. Điều đó có nghĩa là bắt đầu một quy trình IPython riêng cho mọi đánh giá khối mã, rất chậm. Nếu bạn thực sự muốn đi theo con đường đó, thì cần phải có một lời khuyên xung quanh org-babel-python-evaluate-external-processđể làm sạch đầu ra. Bạn có thực sự cần điều này?
không dùng nữa

Không phải bây giờ, tôi cho rằng. Cuối cùng tôi muốn sử dụng các hàm python với bảng tính Emacs, nhưng tôi cho rằng bây giờ tôi có thể gói các chức năng mong muốn trong các kịch bản shell.
wdkrnls
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.