2015-07-06 10 views
7

Przykładowo może wydawać się nielogiczne. Mam funkcję get_name, jak poniżej, i chciałem napisać automatyczny skrypt, aby zadzwonić do tej funkcji i wprowadzić automatycznie do raw_input.Wprowadź do raw_input automatycznie

def get_name(): 
    name = raw_input("Please enter your name : ") 
    print "Hi " + name 

Zautomatyzowany skrypt, jak poniżej, jakie polecenie należy dodać, aby automatycznie wprowadzić wartość?

def run(): 
    get_name() 
    // what should I add here? 
+2

Jeśli jest to twój własny skrypt, wystarczy odłączyć dane wejściowe (wywołanie raw_input) od przetwarzania. Jeśli jest to shitty API innej firmy, które nie oferuje "trybu wsadowego", rób to, co sugeruje Anand S Kumar, ale pamiętaj, że jest to trochę uciążliwe ... – bgusach

Odpowiedz

5

można przekierować stdin do pliku, a następnie raw_input() byłoby odczytać z tego pliku.

Przykład -

def run(): 
    import sys 
    f1 = sys.stdin 
    f = open('input.txt','r') 
    sys.stdin = f 
    get_name() 
    f.close() 
    sys.stdin = f1 

Należy pamiętać, że po wykonaniu - f = open('input.txt','r') i sys.stdin = f, raw_input() będzie czytać z pliku <filename>.

Po zakończeniu wywołania get_name() zamknij plik i przywróć standardowe wejście, używając sys.stdin = sys.__stdin__, jeśli chcesz przywrócić je do wejścia konsoli, możesz je przywrócić do wersji f1, która przywróci je do stwierdzić, że było to przed rozpoczęciem testu.

Należy pamiętać, że podczas przekierowywania wejść należy zachować ostrożność.

2

Do testowania możesz wywołać swój skrypt z wiersza poleceń z przekierowaniem IO - zobacz podproces w podręcznikach, ale dla szybkiego rozwiązania możesz zmienić swój kod w ten sposób, zauważ, że to nie testuje raw_input ale pozwala po prostu przetestować otaczająca kod:

def get_name (name=''): 
    """ Code to get the name for testing supply name int the call """ 
    if len(name) == 0: 
     name = raw_input("Please enter your name : ") 
    print "Hi " + name 

def run(): 
    get_name ("Fred") 
+0

To jest akceptowalna odpowiedź. Jednak podzieliłbym funkcję 'say_hello' z' ask_user_name'. – bgusach

2

można również zastąpić stdin z StringIO (aka plik pamięci) zamiast rzeczywistej pliku. W ten sposób wpisany tekst znajdzie się w kodzie testowym zamiast w osobnym pliku tekstowym.

podstawie Anand Kumar S'S (+1):

def run(): 
    import sys 
    import StringIO 
    f1 = sys.stdin 
    f = StringIO.StringIO('entered text') # <-- HERE 
    sys.stdin = f 
    get_name() 
    f.close() 
    sys.stdin = f1 

Ponadto, dla bardziej zaawansowanych testów interaktywnych funkcji wiersza poleceń/narzędzia może chcesz sprawdzić pakiet pyexpect.

+0

Nice! ale nie działa na notebooku jupyter, jakikolwiek pomysł, jak go poprawić? – Oren

1

Inną opcją jest, aby funkcja wejścia parametr, zalegających do raw_input:

def get_name(infunc=raw_input): 
    name = infunc("Please enter your name : ") 
    print "Hi " + name 

Następnie do celów testowych można przekazać w funkcji, która robi co trzeba:

get_name(lambda prompt: "John Smith") 
Powiązane problemy