如何在Jython中使用ExpectJ?

时间:2013-04-11 14:06:57

标签: java python jython expectj

在我们公司,我们出于某种原因使用Jython。我需要用ExpectJ扩展它,但我无法弄清楚如何做到这一点。

我设法下载 expectj-2.0.7.jar expectj-2.0.7-sources.jar expectj-2.0.7-javadoc .jar 文件,并使它们也可以被Jython和Java本身访问。

所以我可以在我的python脚本中导入它,JVM也可以找到jars(使用classpath loader hack)。但根据ExpectJ's docs,有些事情仍然是错误的。

import expectj

ex = expectj.ExpectJ()                       # I cannot use the second form of the
                                             # constructor where I can pass a timeout
                                             # parameter

sh = ex.spawn(targetshell, 22, usr, passw)   # There is no spawn method in 
                                             # ExpectJ - but why???

这是我陷入困境的地方。为什么ExpectJ对象没有spawn方法?有人有解决方案吗?

1 个答案:

答案 0 :(得分:1)

以下解决方案是确保在执行下一个命令之前生成的进程完成。它保证循环'发送 - 期望 - 等待发送'中发送的命令的完成'然后'再次发送 - 再次预期 - 等待完成'。

为了等待命令提示符完成执行生成的进程,请使用shell.expect("")。如果在此之后还有进一步的expectJ send和expect命令,则可以确保顺序执行。如果没有shell.expect(""),则执行下一步shell.send("exit\n")而不等待它已经生成的进程的完成,在下面的情况下,scp命令在下一个命令发出之前完成。< / p>

import expectj
expectinator = expectj.ExpectJ();
shell = expectinator.spawn(expectj.SshSpawn(host_name, 22, usr_name, ssh_pwd));
shell.send("scp -r src:usr:dest" + "\r")
shell.expect(remote_box_usr + "'s password:");
shell.send(ssh_pwd + "\r");
shell.expect("");
shell.send("exit\n");
shell.expectClose();