ソースがないコンパイル済みの Python コードを少し使用しています。コードはユーザー入力を求めますが、その部分を自動化しようとしています。
基本的に、ユーザー名、パスワードを要求し、特定の状況に応じていくつかのさまざまな質問をします。コンパイルされた関数が raw_input、input、またはその他を使用しているかどうかはわかりません。
StringIO を使用して stdin をユーザー名とパスワードで置き換えることができました。 stdout を自分のクラスに置き換えて、どのプロンプトが表示されるかを把握できますが、データを stdin ベースに選択的に配置することになると困惑します私がstdoutから読んだものについて。
import sys
import re
from StringIO import StringIO
def test():
overwrite = raw_input("The file exists, overwrite? ")
notify = raw_input("This file is marked for notifies. Notify?")
sys.stdout.write("Overwrite: %s, Notify: %s" % (overwrite,notify))
class Catcher(object):
def __init__(self):
pass
def write(self, msg):
if re.search("The file exists, overwrite", msg):
# put data into stdin
if re.search("The file is marked for notification", msg):
# put data into stdin
sys.stdout = Catcher()
test()
質問は状況によって異なる可能性があるため、StringIOオブジェクトをプリロードすることはできませんが、標準入力へのフィードを自動化する必要があります.発生した質問に答えるには、コマンド ラインを使用します。
コンパイルされた関数を呼び出す前に stdin を空の StringIO オブジェクトに設定すると、EOF でエラーが発生します。入力を待機させる方法がわかりません。
このようなもの:
import sys
import re
from StringIO import StringIO
def test():
overwrite = raw_input("The file exists, overwrite? ")
notify = raw_input("This file is marked for notifies. Notify?")
sys.__stdout__.write("Overwrite: %s, Notify: %s" % (overwrite,notify))
class Catcher(object):
def __init__(self, stdin):
self.stdin = stdin
def write(self, msg):
if re.search("The file exists, overwrite", msg):
self.stdin.write('yes\n')
if re.search("The file is marked for notification", msg):
self.stdin.write('no\n')
sys.stdin = StringIO()
sys.stdout = Catcher(sys.stdin)
test()
プロデュース:
Traceback (most recent call last):
File "./teststdin.py", line 25, in <module>
test()
File "./teststdin.py", line 8, in test
overwrite = raw_input("The file exists, overwrite? ")
EOFError: EOF when reading a line
何か案は?