如何在pexpect中看到输出?

时间:2017-08-31 20:57:49

标签: python pexpect

我写了这个程序:

[mik@mikypc ~]$ cat ftp.py 
 #!/usr/bin/env python

 # This connects to the rediris ftp site
 # 
 import pexpect
 child = pexpect.spawn('ftp ftp.rediris.es')

 child.expect('Name .*: ')
 child.sendline('anonymous')
 child.expect('ftp> ')
 child.sendline('noah@example.com')
 child.expect('ftp> ')
 child.sendline('lcd /tmp')
 child.expect('ftp> ')
 child.sendline('pwd')
 child.expect('ftp> ')
 child.sendline('bye')

[mik@mikypc ~]$ ./ftp.py 
[mik@mikypc ~]$ 
[mik@mikypc ~]$ 
[mik@mikypc ~]$ 

但是我看不到输出。我怎么能看到它?我执行它时没有看到任何东西。我怎么能看到输出?。

3 个答案:

答案 0 :(得分:3)

根据pexpect doc

  

可以使用logfile_readlogfile_send成员分别记录来自子项的输入   输出发送给孩子。有时你不想看到你写给孩子的一切。你只想要   记录孩子送回的内容。例如:

child = pexpect.spawn('some_command')
child.logfile_read = sys.stdout
     

如果您使用的是Python 3,则需要在上面的代码中传递编码以生成。
  要单独记录发送给孩子的输出,请使用logfile_send

child.logfile_send = fout 

参见以下示例:

[STEP 105] # cat foo.py
import pexpect, sys

re_PS1 = 'bash-[.0-9]+[$#] $'

proc = pexpect.spawn('bash --norc')
if len(sys.argv) != 1:
    proc.logfile_read = sys.stdout

proc.expect(re_PS1)

proc.sendline("echo hello world")
proc.expect(re_PS1)

proc.sendline('exit')
proc.expect(pexpect.EOF)
proc.close()
[STEP 106] # python foo.py
[STEP 107] # python foo.py foo
bash-4.4# echo hello world
hello world
bash-4.4# exit
exit
[STEP 108] #

答案 1 :(得分:2)

来自pexpect docs:

  

每次调用expect()后,beforeafter属性都将设置为子应用程序打印的文本。 before属性将包含所有文本,直到预期的字符串模式。 after字符串将包含与预期模式匹配的文本。

因此,战略位置的print(child.before)应该满足您的需求。

答案 2 :(得分:0)

您还可以将pexpect的输出记录到日志文件中:

child.logfile = open("/tmp/mylog", "w")

然后sendline的每个响应都将打印到日志