조직 모드 바벨-파이썬에서 대화 형 코드 블록 평가


12

이 질문 과 마찬가지로 "org"모드에서 "입력"명령어를 포함하는 Python 소스 코드 블록을 평가하고 싶지만 평가하는 동안 대화 형 평가 (사용자 입력 포함)를 수행하거나 알려진 입력을 제공하는 방법을 찾을 수 없습니다 사전에 (예를 들어 파일에 저장).

이 제한 사항은 input학생들을위한 교과서에 포함되어야하기 때문에 수업을 명시 적으로 사용해야합니다.

코드 예 :

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

그러한 대화식 평가를하거나 시뮬레이션 할 수 있습니까 (소스 코드에 가짜 입력을함으로써)?


org-mode export를 사용 하여 학생들을위한 예제 코드를 다른 형식 (예 : html)으로 생성 하시겠습니까?
Melioratus

파이썬의 input () 함수는 인용 된 텍스트 만 한 줄로 가져옵니다 ( 예 : "hello"또는 "hi \ nhello \ nhowdy")?
Melioratus

당신의 의견에 대한 @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을 작성하십시오 (예 : 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 이전 파이썬에서 작성된 파일 SRC블록은 내장을 이용하여 현재 블록에 가져올 프리앰블 : 헤더 값 from example1 import *.


매우 흥미로운 해결책입니다. 감사합니다. 나는 그것을 해결책으로 받아들이고 파이썬 생성기를 기반으로 변형을 제안하고 입력 (...) 함수를 모방하기 위해 체계적으로 "str"객체를 반환합니다.
Lgen

8

pythonorg-mode에서 리터럴 프로그래밍을 사용하여 코드 블록을 평가 하십시오.

:var헤더를 사용 하여 변수를 할당하고 코드를 테스트하십시오.

참고 : 원하는 경우 및를 사용 elisp (read-string "Prompt: ")하여 (read-number "Prompt: ")emacs 내부에 사용자 입력을 요구하십시오 .


예 1- 인쇄 (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 에서 테스트되었습니다 .


매우 흥미로운 해결책; 두 번째 파이썬 소스 블록의 명령 (예 : a = input ( 'Value of a'))이 설명서 텍스트 일 ​​뿐이며 명령으로 취급되지 않았다는 것을 이해하는 데 시간이 걸렸습니다.
Lgen

@Lgen-감사합니다! noweb조직 모드 기능 의 문맹 프로그래밍 은 훌륭하고 놀랍도록 유용합니다! 추가 코드 예제를 원하는 경우 알려주십시오. Q & A 형식에 맞지 않는 것이 필요하다면 GitHub 리포지토리에 게시 해 드리겠습니다.
Melioratus

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

학생들이 내 보낸 내용에 따라, 내 보낸 내용을 보지 못할 수도 있습니다.


답변을 제안한 John에게 감사합니다. 코드 블록의 입력 함수에 대한 다중 호출로 확장 할 수 있는지 궁금합니다 (예 : a = 입력 ( "Value of a") b = 입력 ( "Value of b")). "# + BEGIN_SRC python"문에서 일반적으로 사용하고 ": export both"texbook을 빌드하려면이 줄은 내 보낸 텍스트에 표시되지 않아야합니다.
Lgen

세션을 사용하면 가능합니다 : # + BEGIN_SRC python : session : exports none def input (x) : if x == 'a의 값': return 3 elif x == 'b의 값': return 4 # + END_SRC # + RESULTS : # + BEGIN_SRC python : 결과 출력 : session a = input ( 'Value of a') b = input ( 'b'Value) print (a + b) # + END_SRC # + RESULTS : : >>> >>> 7
John Kitchin

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.