环境和问题
Maven依赖:
Java代码:
问题:
原因:https://stackoverflow.com/questions/9100909/using-multiprocessing-2-6-2-1-package-in-jython
此外Jython还有其他问题:
Python执行时的sys.path和Jython的sys.path路径不一致。两者加载类库的路径不一样。
代码:
test_sys.py代码:
打印出来的是:
直接执行test_sys.py打印sys.path:
常见的java调用python脚本方式
1.通过Jython.jar提供的类库实现:上面使用的就是这种方式
2.通过Runtime.getRuntime()开启进程来执行脚本文件
介绍下第2种方式:
代码:
这样就正常执行了。
【注意】:
Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息。由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过 p.getOutputStream(), p.getInputStream(), p.getErrorStream() 方法重定向给它的父进程了。用户需要用这些stream来向子进程输入数据或获取子进程的输出。
但是向标准输出流和标准错误流写数据,而JVM却不读取,数据会暂存在linux缓存区,当缓存区存满之后导致该进程无法继续写数据,会僵死,导致java进程会卡死在waitFor()处。我这里采取的办法是:java进程在waitFor()前不断读取标准输出流和标准错误流。
参考资料:
Running system commands in Java applications
用Java执行Python:Jython踩坑笔记
Java 调用外部命令使用 waitFor() 方法阻塞或锁死
Java执行shell遇到的各种问题