2013-07-13 8 views
13
child = pexpect.spawn ('/bin/bash') 
child.sendline('ls') 
print(child.readline()) 
print child.before, child.after 

Wszystko mam z tego kodu w moim wyjściem jestPython jak odczytać wyjście z pexpect child?

ls 

ls 

Ale kiedy mój kod jest

child = pexpect.spawn('ls') 
print(child.readline()) 
print child.before, child.after 

Wtedy to działa, ale tylko przez pierwsze 2 wydruków. Czy używam złego polecenia wysyłania? Próbowałem wysłać, napisać, wysłać i nie mogłem już znaleźć.

Odpowiedz

7
#!/usr/bin/env python 

import pexpect 
child = pexpect.spawn("ssh [email protected] -p 2222") 
child.logfile = open("/tmp/mylog", "w") 
child.expect(".*assword:") 
child.send("XXXXXXX\r") 
child.expect(".*\$ ") 
child.sendline("ls\r") 
child.expect(".*\$ ") 

przejść, aby otworzyć plik dziennika: - przejść do terminala

$gedit /tmp/mylog 
12

W pexpect przed i po atrybuty są wypełniane po tym jak oczekiwać metody. Najczęstszą rzeczą stosowaną w tej sytuacji jest oczekiwanie na prompt (abyś wiedział, że poprzednie polecenie zakończyło wykonywanie). Tak więc, w przypadku, kod może wyglądać tak:

child = pexpect.spawn ('/bin/bash') 
child.expect("Your bash prompt here") 
child.sendline('ls') 
#If you are using pxssh you can use this 
#child.prompt() 
child.expect("Your bash prompt here") 
print(child.before) 
2

myślę, wszystko czego potrzebujesz to:

p = pexpect.spawn('ls') 
p.expect(pexpect.EOF) 
print(p.before) 

lub

p = pexpect.spawn('/bin/ls') 
p.expect(pexpect.EOF) 
print(p.before) 

lub

p = pexpect.spawn('/bin/bash -c "ls"') 
p.expect(pexpect.EOF) 
print(p.before) 

lub nawet

print(pexpect.run('ls')) 
8

Spróbuj wykonać następujące czynności:

import pexpect 
child = pexpect.spawn('ls') 
print child.read() # not readline 

read() daje całą moc ls.

+0

działa również dla 'spawnu' w moich próbach, jeżeli inne Ulubione odpowiedzi nie. Może najpierw sprawdzić, czy polecenie zostało zakończone, chociaż prawdopodobnie nie będzie miało znaczenia dla 'ls'. – AlanSE

2
import sys 
import pexpect 
child = pexpect.spawn('ls') 
child.logfile = sys.stdout 
child.expect(pexpect.EOF) 

Zobacz the manual entry on the subject.

+1

Zastrzeżenie: jeśli 'child.sendline (...)' jest ostatnią linią programu, dane wyjściowe nie zostaną przechwycone. Oczekiwanie na EOF pomaga: 'child.expect (pexpect.EOF)'. http://pexpect.readthedocs.io/en/stable/commonissues.html#truncated-output-just-before-child-exits –

+0

@VictorSergienko Edytowane. Dzięki! – djhaskin987

+1

Para więcej notatek: 1. Najpierw przypiszę 'logfile'. 2. Oczekiwanie na EOF działa tylko wtedy, gdy strumień faktycznie się kończy. Jeśli tworzymy powłokę, musimy jawnie dodać 'exit' jako ostatnią komendę. –

Powiązane problemy