2012-01-12 2 views
-1

나는 어떻게 undestand 노력하고있어 input 작동합니다.subprocess는 input()에 입력을 제공하는 유일한 방법입니까?

간단한 함수와 같은 예를 들어 감안할 때 :

f를 호출하고 파이프 라인을 구축하지 않고 뭔가를 인쇄 할 수있는 방법이있다
def f(): 
    s = input() 
    print(s) 

?

분명히 말미에 아무 것도 입력하지 않아도됩니다. 나는 반드시이 솔루션을 추천 할 것입니다,하지만 당신은 다른 기능에 input를 리 바인드 수

답변

2

sys.stdin을 일시적으로 재정의하는 것이 한 가지 방법입니다.

예 : 나는 당신이 무슨 말을하는지 이해가 확실하지 않다

import sys 
from StringIO import StringIO 

input_text = 'whatever you want the function to read from input()' 

old_stdin = sys.stdin 
#Reassign stdin to a StringIO object 
sys.stdin = StringIO(input_text) 

f() 

sys.stdin = old_stdin 
0

하지 ...

1

예, 서브 프로세스에서 두 번째 파이썬 쉘을 실행하는 것은 input에 입력을 제공 할 수있는 유일한 방법 (하지 않는 한이다 모듈에서 input을 재정의하려는 경우).

대신 임의의 파일을 읽고 (기본값을 sys.stdin으로 설정해야합니다). 그런 다음 다른 파일을 디스크에 임시로 저장하거나 파일 형태의 StringIO 개체로 간단하게 설정할 수 있습니다.

import sys,StringIO 
def f(inputfile=sys.stdin): 
    s = inputfile.readline() 
    print(s) 

# To test, call it like this: 
f(StringIO.StringIO('testdata\n')) 
+0

. 당신은 임의의 파일을 읽고, 디폴트'sys.stdin'을 만들고, 다른 파일을 설정한다는 의미를 설명 할 수 있습니까? –

+0

@RikP. 데모 코드가 추가되었습니다. 그 문장의 어느 부분이 당신에게 명확하지 않은가? – phihag

+0

이제 네가 의미하는 바를 이해한다. 고마워! 나는'input'이 어떻게 작동하는지 이해하려고 노력했지만, 여러분의 예제는 도움이되었습니다. –

-1

input()에는 기본 텍스트를 입력 할 수 없습니다.

하지만 리눅스와 배쉬를 사용하는 경우,이 같은 작업을 수행 할 수 있습니다 (이 SO-answer에서 수정)

import readline 

def rlinput(prompt, prefill=''): 
    readline.set_startup_hook(lambda: readline.insert_text(prefill)) 
    try: 
     return raw_input(prompt) 
    finally: 
     readline.set_startup_hook() 

rlinput("Do you want to delete all files? ", "yes") 

.

은 참조 :

+0

Enter를 누르지 않아도됩니까? –

+0

여기 bash를 사용해야하는 이유는 무엇입니까? – glglgl

+0

@RikP .: 입력을 마치려면 Enter 키를 눌러야합니다. 어떻게 다른 사람에게 제출 하시겠습니까? glglgl : 다른 쉘을 사용하지 않았습니다. 거의 모든 셸에서 작동 할 것 같지만 "Better Python Console"이라는 gedits에서는 작동하지 않습니다. 내가 더 많은 껍질에서 그것을 테스트하지 않았기 때문에 나는 그것이 작동하지 않을 수도 있음을 주목하기를 원했다. –

관련 문제