pexpect - can't run example, kept getting AttributeError: 'module' object has no attribute 'spawn'

17,725

Solution 1

Ok, finally got it working by copying the pexpect.py script into the same directory as where my scripts are. Weird thing was that by executing my code stand-alone in IDLE it works but not via python unless the pexpect.py is in same directory as your script.

Solution 2

see: http://pexpect.readthedocs.io/en/stable/overview.html#windows

Requirements This version of Pexpect requires Python 3.3 or above, or Python 2.7.

As of version 4.0, Pexpect can be used on Windows and POSIX systems. However, pexpect.spawn and pexpect.run() are only available on POSIX, where the pty module is present in the standard library. See Pexpect on Windows for more information.

Share:
17,725

Related videos on Youtube

user2766739
Author by

user2766739

Updated on June 04, 2022

Comments

  • user2766739
    user2766739 almost 2 years

    I am running Python3 and been trying to run sshls.py script but always fail with:

    AttributeError: 'module' object has no attribute 'spawn"

    I tried running as:

    python3 sshls.py
    

    I even modified the script to set either env or python script but still fails:

    #!/usr/bin/python3
    

    OR

    #!/usr/bin/env python3
    

    I tried with python2.7 and still get same error.

    Content of script:

    from __future__ import print_function
     
    from __future__ import absolute_import
     
    import pexpect
    import getpass, os, traceback
    def ssh_command (user, host, password, command):
         ssh_newkey = 'Are you sure you want to continue connecting'
         child = pexpect.spawn('ssh -l %s %s %s'%(user, host, command))
         i = child.expect([pexpect.TIMEOUT, ssh_newkey, 'password: '])
         if i == 0: # Timeout
             print('ERROR!')
             print('SSH could not login. Here is what SSH said:')
             print(child.before, child.after)
             return None
         if i == 1: # SSH does not have the public key. Just accept it.
             child.sendline ('yes')
             child.expect ('password: ')
             i = child.expect([pexpect.TIMEOUT, 'password: '])
             if i == 0: # Timeout
                 print('ERROR!')
                 print('SSH could not login. Here is what SSH said:')
                 print(child.before, child.after)
                 return None
         child.sendline(password)
         return child
     
    def main ():
         host = "www.example.com"
         user = "root"
         password = "password"
         child = ssh_command (user, host, password, '/bin/ls -l')
         child.expect(pexpect.EOF)
         print(child.before)
     
    if __name__ == '__main__':
         try:
             main()
         except Exception as e:
             print(str(e))
             traceback.print_exc()
             os._exit(1)
    
    • user2766739
      user2766739 over 10 years
      Thanks Robert Harvey for modifying my code formatting, I was just able to save the changes too but says someone already helped me updated it.