我正在嘗試如何運作input
。子過程是向input()提供輸入的唯一方式嗎?
鑑於例如一個簡單的功能,如:
def f():
s = input()
print(s)
有一種方法叫f
並使其打印的東西不樓宇管道?
很明顯,沒有在termimal中輸入任何內容。
我正在嘗試如何運作input
。子過程是向input()提供輸入的唯一方式嗎?
鑑於例如一個簡單的功能,如:
def f():
s = input()
print(s)
有一種方法叫f
並使其打印的東西不樓宇管道?
很明顯,沒有在termimal中輸入任何內容。
這樣做的一種方法是暫時重新定義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
這並不是說我一定會推薦這個解決方案,但你可以重新綁定input
到不同的功能...
是,在子進程執行的第二蟒蛇殼是給輸入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'))
您無法向input()提供默認文本。
但是如果你使用Linux和Bash,你可以做這樣的事情:
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")
(從這個SO-answer修改)。
參見:
這不需要按Enter鍵? – 2012-01-12 13:54:36
爲什麼需要在這裏使用bash? – glglgl 2012-01-12 14:17:09
@RikP .:您需要按回車才能完成輸入。你想如何提交它呢? glglgl:我沒有使用其他的shell。我猜它可能適用於幾乎所有的shell,但它不適用於gedits「更好的Python控制檯」。因爲我沒有用更多的shell來測試它,我只是想指出它可能無法工作。 – 2012-01-12 14:47:32
我不明白你在說什麼。你能從一個任意文件中解釋你的意思嗎,使用默認的'sys.stdin'然後設置一個不同的文件? – 2012-01-12 14:02:04
@RikP。添加了演示代碼。句子的哪一部分對你不清楚? – phihag 2012-01-12 14:33:00
現在我明白你的意思了,謝謝!我試圖理解'input'是如何工作的,但是無論如何你的例子都很有幫助。 – 2012-01-12 14:39:09