TypeError when calling expect method of pexpect module in Python 3

半腔热情 提交于 2021-02-07 14:25:41

问题


I am trying to use pexpect module (version 3.3) with Python 3.4.0. I get an error

TypeError: must be str, not bytes

when I call child.expect method.

Actual code is standard example from pexpect documentation:

child = pexpect.spawn('ssh foo@bar.com')
index = child.expect([pexpect.TIMEOUT, pexpect.EOF, ssh_newkey, '.*password:'])

Exactly the same code works properly with pexpect module (version 3.1), and Python version 2.7.6.

Pexpect documentation on GitHub states that pexpect version 3.3 requires Python 2.6 or 3.2 or above. Does anybody know if pexpect does not work with Python 3 for some reason despite what is stated in documentation for this module?

This is traceback output that I get:

Traceback (most recent call last):
  File "/home/sambo9/python/python3-pexpect.py", line 17, in <module>
    main()
  File "/home/sambo9/python/python3-pexpect.py", line 13, in main
    child.expect('.*password:')
  File "/usr/local/lib/python3.4/dist-packages/pexpect/__init__.py", line 1451, in expect
    timeout, searchwindowsize)
  File "/usr/local/lib/python3.4/dist-packages/pexpect/__init__.py", line 1466, in expect_list
    timeout, searchwindowsize)
  File "/usr/local/lib/python3.4/dist-packages/pexpect/__init__.py", line 1535, in expect_loop
    c = self.read_nonblocking(self.maxread, timeout)
  File "/usr/local/lib/python3.4/dist-packages/pexpect/__init__.py", line 985, in read_nonblocking
    self._log(s, 'read')
  File "/usr/local/lib/python3.4/dist-packages/pexpect/__init__.py", line 908, in _log
    second_log.write(s)
  File "/usr/lib/python3.4/idlelib/PyShell.py", line 1339, in write
    raise TypeError('must be str, not ' + type(s).__name__)
TypeError: must be str, not bytes

Additionally, I also see "OpenSSH" box pop open via GUI on Ubuntu prompting for password when I run the script. This does not happen under Python 2.7.6. In Python 2.7, I can login into system without any manual interaction - everything happens automatically via script.


回答1:


From the documentation:

# In Python 3, spawnu should be used to give str to stdout:
child = pexpect.spawnu('some_command')
child.logfile = sys.stdout


来源:https://stackoverflow.com/questions/26831931/typeerror-when-calling-expect-method-of-pexpect-module-in-python-3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!