Org Mode Babel-Pythonでのインタラクティブコードブロックの評価


12

この質問と同様に「入力」命令を含むPythonソースコードブロックを(組織モードで)評価したいのですが、評価中にインタラクティブな評価(ユーザー入力による)を行う方法や、既知の入力を提供する方法が見つかりません事前に(たとえば、ファイルに格納されています)。

私の制約はinput、これらすべてが学生のための教科書に含まれるべきであるので、指示を明示的に使用することです。

コードの例:

#+BEGIN_SRC python :results output 
a= input("Value") 
print(a)
#+END_SRC

そのようなインタラクティブな評価をしたり、それをシミュレートしたりすることは可能ですか(ソースコードに偽の入力を与えることによって)?


org-mode exportを使用して、学生向けのサンプルコードをHTMLなどの他の形式に生成しますか?
Melioratus、2016

Pythonのinput()関数は、引用符で囲まれたテキストのみを1行で受け取ります。たとえば、「hello」や「hi \ nhello \ nhowdy」などですよね?
Melioratus、2016

@Melioratus Thaksあなたのコメント; はい、私は(LaTeX / pdfへの)組織モードのエクスポートを使用し、コードと結果の両方をエクスポートします。複数行( "" "..." "")テキストを入力関数のパラメーターとして使用することもできます。私の問題は、コードの実行中に「入力」関数に値を導入することです。
Lgen

説明をありがとう!nowebコードをテストして結果をエクスポートできるorg-mode の文芸的プログラミング機能を使用した回答を投稿します。
Melioratus

おかげで、これはJohn Kitchinによって提案されたソリューションの代わりになる可能性があります(もつれのステップを回避しているのではないでしょうか?)。
Lgen

回答:


8

以下は、エクスポートされていない複雑なファイルを使用して入力関数を置き換える代替アプローチです。

#+BEGIN_SRC python :session :exports none :tangle example1.py
def input(x): 
    if x == 'Value of a':
        return 3
    elif x == 'Value of b':
        return 4 

#+END_SRC 

#+RESULTS: 

ヒント:を押すC-cC-vtか、M-xorg-babel-tangleコマンドを使用して、ファイルを作成(つまり、もつれ)しexample1.pyます。


#+BEGIN_SRC python :results output :preamble from example1 import *
a = input('Value of a')
b = input('Value of b')
print(a + b) 
#+END_SRC 

#+RESULTS:
: 7

注:example1.py以前のPythonから作成されたファイルSRCブロックは、組み込みを使用して、現在のブロックにインポートされるプリアンブル:ヘッダと値from example1 import *


非常に興味深い解決策、ありがとうございます。私はそれを解決策として受け入れ、pythonジェネレーターに基づいてバリアントを提案し、体系的に「str」オブジェクトを返してinput(...)関数を模倣します。
Lgen

8

python組織モードでの文芸的プログラミングを使用してコードブロックを評価します。

使用:var割り当て変数とあなたのコードをテストするヘッダが。

注:必要に応じてelisp (read-string "Prompt: ")、と(read-number "Prompt: ")を使用して、emacs内のユーザー入力を求めます。


例1- print(a)

  • 割り当てhello worlda


    #+name: ex1-code  
    #+header: :var a="hello world"  
    #+begin_src python :results verbatim replace output :exports results  
      print(a)  
    #+end_src
    
    #+begin_src python :eval never :exports code :noweb yes   
      a = input('Value of a')  
      <<ex1-code>>  
    #+end_src  
    
    #+results: ex1-code
    : hello world
    

例2- print(a + b)

  • 割り当て1a

  • 割り当て2b


    #+name: ex2-code
    #+header: :var a=1 
    #+header: :var b=2 
    #+begin_src python :results replace output  :exports results 
      print(a + b)
    #+end_src
    
    #+begin_src python :eval never :exports code :noweb yes 
      a = input('Value of a')
      b = input('Value of b')
      <<ex2-code>>
    #+end_src  
    
    #+results: ex2-code
    : 3
    

例3- print(a,b,c)

  • Value of a入力を求められたらThanks
  • 入力を求められたらValue of b入力します4
  • 入力を求められたらValue of c入力しますyour question


    #+NAME: ex3-code
    #+header: :var a=(read-string "Value of a ") 
    #+header: :var b=(read-number "Value of b ") 
    #+header: :var c=(read-string "Value of c ") 
    #+begin_src python :results replace output   :exports results 
      print a,b,c
    #+end_src  
    
    #+begin_src python :eval never :exports code :noweb yes 
      a = input('Value of a')
      b = input('Value of b')
      c = input('Value of c')
      <<ex3-code>>
    #+end_src  
    
    #+results: ex3-code
    : Thanks 4 your question
    

組織ファイルをエクスポートすると、出力は以下の例のようになります。


例1- print(a)

  • 割り当てhello worlda

    a = input('Value of a')
    print(a)
    
    hello world
    

例2- print(a + b)

  • 割り当て1a
  • 割り当て2b

    a = input('Value of a')
    b = input('Value of b')
    print(a + b)
    
    3
    

例3- print(a,b,c)

  • Value of a入力を求められたらThanks
  • 入力を求められたらValue of b入力します4
  • 入力を求められたらValue of c入力しますyour question

    a = input('Value of a')
    b = input('Value of b')
    c = input('Value of c')
    print a,b,c
    
    Thanks 4 your question
    


このコードは、
GNU Emacs 24.5.1(x86_64-unknown-cygwin、GTK +バージョン3.14.13)
Org-Modeバージョン:8.3.2
およびgithubでテストされています。


非常に興味深い解決策。2番目のpythonソースブロックの命令(たとえば、a = input( 'Value of a'))は単なるドキュメントテキストであり、命令として扱われなかったことを理解するのに時間がかかりました(プログラミングの読み書きには慣れていません)。
Lgen

@Lgen-ありがとうございます!noweb組織モードの機能での文芸的プログラミングは、驚くほど素晴らしく、信じられないほど便利です!追加のコード例が必要な場合はお知らせください。Q&A形式に適合しないものが必要な場合は、GitHubリポジトリに投稿させていただきます。
Melioratus、2016

6

org-babelで真にインタラクティブなPython入力を取得することは不可能だと思います。

プリアンブルを使用して入力関数を再定義し、入力の使用をシミュレートするものを返すことができます。たとえば、ここでは、ユーザーが「3」と入力したように見せます。

#+BEGIN_SRC python :results output :preamble def input(x): return 3
a = input("value ")
print(a)
#+END_SRC

#+RESULTS:
: 3

エクスポートされたものを生徒が見る内容によっては、あなたがこれを行ったことを生徒が認識しない場合があります。


ジョンが回答を提案してくれてありがとう。コードブロックの入力関数への複数の呼び出しに拡張できるかどうか疑問に思っていました(たとえば、a = input( "Value of a")b = input( "Value of b"))。texbookをビルドするには、「#+ BEGIN_SRC python」ステートメントで通常「:export both」を使用するため、この行はエクスポートされたテキストに表示されません。
Lgen

セッションを使用する場合、それは可能です:#+ BEGIN_SRC python:session:exports none def input(x):if x == 'Value of a':return 3 elif x == 'Value of b':return 4# + END_SRC#+ RESULTS:#+ BEGIN_SRC python:results output:session a = input( 'Value of a')b = input( 'Value of b')print(a + b)#+ END_SRC#+ RESULTS::: >>> >>> 7
ジョンキッチン2016

2

John Kitchinのソリューションを補完するものとして、ジェネレーターを使用して、input(...)関数に「フィード」する連続した値を提供し、strオブジェクトを体系的に返すことを提案します。

#+BEGIN_SRC python :session :exports none :tangle example2.py :results none
def generate(lst):
    for element in lst:
        yield str(element)

generator =  generate(["Thanks",4,"your help"])

def input(x):
     return generator.__next__()
#+END_SRC 


#+BEGIN_SRC python :results output :preamble from example2 import * :exports both
a = input('Value of a')
b = input('Value of b')
c = input('Value of c')
print(a,b,c)
#+END_SRC 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.