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

Alles, was ich mit diesem Code in meiner Ausgabe zu erhalten istPython, wie Ausgabe von Pexpect Kind lesen?

ls 

ls 

Aber wenn mein Code

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

Dann funktioniert es, aber nur für die ersten 2 druckt. Benutze ich den falschen Sendebefehl? Ich habe versucht, senden, schreiben, senden, und konnte nicht mehr finden.

Antwort

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(".*\$ ") 

gehen Ihre Logdatei zu öffnen: - gehen an Klemme

$gedit /tmp/mylog 
12

In pexpect die vor und nach Attributen nach einer erwarten Methode bestückt sind. Die gebräuchlichste Sache in dieser Situation ist, auf die Eingabeaufforderung zu warten (damit Sie wissen, dass der vorherige Befehl die Ausführung beendet hat). Also, in Ihrem Fall könnte der Code wie folgt aussehen:

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

Ich glaube, alles, was Sie brauchen, ist:

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

oder

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

oder

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

oder sogar

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

Versuchen Sie Folgendes:

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

Die read() wird Ihnen die gesamte Ausgabe des ls.

+0

auch für 'spawnu' in meinem Test funktioniert, wo die anderen Top-Antworten nicht. Müsste zuerst überprüfen, ob der Befehl beendet ist, obwohl dies wahrscheinlich für 'ls' keine Rolle spielt. – AlanSE

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

Siehe the manual entry on the subject.

+1

Vorbehalt: Wenn 'child.sendline (...)' die letzte Zeile des Programms ist, wird die Ausgabe nicht (Zeit zu haben) erfasst. Das Erwarten eines EOF hilft: 'child.expect (pexpect.EOF)'. http://pexpect.readthedocs.io/en/stable/commonissues.html#truncated-output-just-before-child-exits –

+0

@VictorSerienko Bearbeitet. Vielen Dank! – djhaskin987

+1

Weitere Hinweise: 1. Ich würde 'logfile' zuerst zuweisen. 2. Expecting EOF funktioniert nur, wenn der Stream tatsächlich endet. Wenn wir eine Shell erzeugen, müssen wir explizit 'exit' als letzten Befehl hinzufügen. –