java - 使用文件参数通过 Java 运行 python 脚本
问题描述
我有一个标准的 Maven 项目,我想运行meTypeset脚本。该脚本需要 3 个参数,其中第二个是文件,第三个是创建为输出的文件夹。
这是脚本在 cmd 中运行的方式:
meTypeset.py docx <input> <output_folder> [options]
这就是我尝试在 Java 中运行它的方式:
public static void main(String args[]) {
String[] cmd = {
"python",
"resources\\pyscripts\\meTypeset.py",
"docx",
"resources\\exampledocs\\example_journal.docx",
"resources\\output"
};
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
e.printStackTrace();
}
}
什么也没有发生,没有错误,但也没有结果
解决方案
与 python 不同,Java 可能需要一些帮助。我猜你是在 Windows 上运行的吗?
您调用Runtime.exec()方法。该方法返回一个Process实例,您可以在它的文档中阅读
默认情况下,创建的进程没有自己的终端或控制台。它的所有标准I/O(即stdin、stdout、stderr)操作都将被重定向到父进程,在那里可以通过使用getOutputStream()、getInputStream() 和getErrorStream() 方法获得的流来访问它们。父进程使用这些流向进程提供输入并从进程中获取输出。因为一些原生平台只为标准输入输出流提供有限的缓冲区大小,不能及时写入进程的输入流或读取进程的输出流,可能会导致进程阻塞,甚至死锁。
因此,您的进程很可能是由操作系统启动的,但由于 I/O 限制而被阻止。通过阅读 STDOUT 和 STDERR 流直到您的流程完成来解决这个问题。在https://www.baeldung.com/run-shell-command-in-java可以看到一种好的编程模型
推荐阅读
- django - 如何显示导致 ProtectedError 的外键?
- logstash - Elastic Stack CSV 年份列
- android - 如何在用户根据要求输入数据的 android studio 中创建动态 Imageview
- titanium - 合金编译器失败但经典的钛作品
- java - 使用 Java Apache POI 搜索特定的 Excel 单元格
- javascript - while() 循环无限期地运行;条件不会改变;.replace() 没有按预期工作
- flutter - Flutter 中的 Streams 和 Sockets 有什么区别?
- mysql - 项目同时使用 MySQL 和 PostgreSQL 时从 JsonStringType 切换到 JsonBinaryType
- javascript - 从字符串中删除给定值以及 Javascript 中的逗号
- python - 如何在 ModelForm 中添加密码占位符?