1

ソースがないコンパイル済みの 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

何か案は?

4

2 に答える 2

1

StringIO完全に回避するソリューションは次のとおりです。

import sys
import re

class Catcher(object):
    def __init__(self, handler):
        self.handler = handler
        self.inputs = []

    def __enter__(self):
        self.__stdin  = sys.stdin
        self.__stdout = sys.stdout
        sys.stdin = self
        sys.stdout = self

    def __exit__(self, type, value, traceback):
        sys.stdin  = self.__stdin
        sys.stdout = self.__stdout

    def write(self, value):
        result = self.handler(value)
        if result:
            self.inputs = [result] + self.inputs

    def readline(self):
        return self.inputs.pop()

使用されます:

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))


@Catcher
def exist_notify(msg):
    if re.search("The file exists, overwrite", msg):
        return 'yes'
    if re.search("This file is marked for notifies", msg):
        return 'no'

with exist_notify:
    test()
于 2012-11-20T19:40:46.033 に答える