java - 如何在 Jython 中使用 ExpectJ?

标签 java python jython expectj

在我们公司,我们出于某种原因使用 Jython。我需要用 ExpectJ 扩展它,但我不知道该怎么做。

我成功下载了expectj-2.0.7.jarexpectj-2.0.7-sources.jarexpectj-2.0.7-javadoc .jar 文件并使 Jython 和 Java 本身也可以访问它们。

所以我可以将它导入到我的 python 脚本中,并且 JVM 也会找到这些 jar(通过使用 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 方法?有人有解决办法吗?

最佳答案

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

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

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();

关于java - 如何在 Jython 中使用 ExpectJ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15950937/

相关文章:

python - 来自通过 Scrapyd 部署的 Scrapy Spider 的自定义 JSON 响应

jython - OpenRefine:根据另一列的变量选择值

python - 检测 python 中套接字的正常关闭

java - 如何删除将文档转换为字符串时引入的新行?

java - 构建时未找到 Maven 子模块

java - 将扫描仪用于多行文本文件

python 将字典数组映射到字典?

java - 使用 Jython 从 Java 代码调用 Python 导致错误 : ImportError: no module named nltk

java - Windows 7下从Jython获取文件夹权限

Java 继承 : How to achieve something similar to "multiple inheritance" when it is not allowed in Java?