java运行python脚本_从Java中的Python脚本调用和接收输出?

从Java中的Python脚本调用和接收输出?

从Java执行Python脚本并接收该脚本的输出的最简单方法是什么? 我一直在寻找不同的库,例如Jepp或Jython,但是大多数库都已过时。 库的另一个问题是,如果我使用库,则我需要能够轻松地在源代码中包含一个库(尽管我不需要为库本身提供源代码)。

因此,最简单/最有效的方法是简单地执行诸如使用runtime.exec调用脚本之类的操作,然后以某种方式捕获打印输出吗? 或者,即使这对我来说很痛苦,我也可以将Python脚本输出到一个临时文本文件,然后用Java读取文件。

注意:Java和Python之间的实际通信不是我要解决的问题的要求。 但是,这是我可以想到的轻松执行需要完成的操作的唯一方法。

404 Not Found asked 2020-06-18T01:11:40Z

10个解决方案

56 votes

不知道我是否正确理解了您的问题,但前提是您可以从控制台调用Python可执行文件,并且只想捕获Java中的输出,则可以在Java exec()类中使用exec()方法。

Process p = Runtime.getRuntime().exec("python yourapp.py");

您可以在此处阅读有关如何实际读取输出的信息:

[HTTP://呜呜呜.Dev daily.com/Java/额度/平均/平均010016]

还有一个Apache库(Apache exec项目)可以为您提供帮助。 你可以在这里读更多关于它的内容:

[HTTP://呜呜呜.Dev daily.com/Java/Java-exec-process builder-process-1]

[HTTP://Commons.Apache.org/exec/]

Sevas answered 2020-06-18T01:12:12Z

28 votes

您可以在Java项目中包括Jython库。 您可以从Jython项目本身下载源代码。

Jython确实提供了对JSR-223的支持,它基本上允许您从Java运行Python脚本。

您可以使用numbers.py来配置要将执行输出发送到的位置。

例如,假设您在名为numbers.py的文件中具有以下Python脚本:

for i in range(1,10):

print(i)

因此,可以从Java运行它,如下所示:

public static void main(String[] args) throws ScriptException, IOException {

StringWriter writer = new StringWriter(); //ouput will be stored here

ScriptEngineManager manager = new ScriptEngineManager();

ScriptContext context = new SimpleScriptContext();

context.setWriter(writer); //configures output redirection

ScriptEngine engine = manager.getEngineByName("python");

engine.eval(new FileReader("numbers.py"), context);

System.out.println(writer.toString());

}

输出将是:

1

2

3

4

5

6

7

8

9

只要您的Python脚本与Python 2.5兼容,使用Jython运行该脚本就不会有任何问题。

Edwin Dalorzo answered 2020-06-18T01:12:59Z

8 votes

我以前遇到过同样的问题,在这里也阅读了答案,但是没有找到任何令人满意的解决方案可以兼顾兼容性,性能和格式输出,Jython无法使用扩展C包并且比CPython慢。 所以最后我决定自己发明轮子,花了我5个晚上,希望它也能对您有所帮助:jpserve([https://github.com/johnhuang-cn/jpserve)。]

JPserve提供了一种简单的方法来调用Python并通过格式正确的JSON交换结果,而几乎没有性能损失。 以下是示例代码。

首先,在Python端启动jpserve

>>> from jpserve.jpserve import JPServe

>>> serve = JPServe(("localhost", 8888))

>>> serve.start()

INFO:JPServe:JPServe starting...

INFO:JPServe:JPServe listening in localhost 8888

然后从JAVA端调用Python:

PyServeContext.init("localhost", 8888);

PyExecutor executor = PyServeContext.getExecutor();

script = "a = 2\n"

+ "b = 3\n"

+ "_result_ = a * b";

PyResult rs = executor.exec(script);

System.out.println("Result: " + rs.getResult());

---

Result: 6

John Huang answered 2020-06-18T01:13:33Z

4 votes

我一直在寻找像Jepp或Jython这样的不同库,但是大多数库似乎已经过时了。

Jython不是“图书馆”。 它是Java虚拟机之上的Python语言的实现。 绝对不是过时的。 最新版本是今年2月24日。 它实现了Python 2.5,这意味着您将缺少一些最新功能,但与2.7相比并没有太大区别。

注意:Java和Python之间的实际通信不是上述任务的要求,因此,这并不是我的功课。 但是,这是我可以想到的轻松执行需要完成的操作的唯一方法。

对于学校作业,这似乎极不可能。 请告诉我们更多有关您真正想做的事情。 通常,学校作业会确切地指定您将要使用的语言,而我从未听说过一种语言涉及一种以上的语言。 如果确实如此,他们会告诉您是否需要建立这种沟通方式,以及他们打算如何进行这种沟通。

Karl Knechtel answered 2020-06-18T01:14:07Z

3 votes

Jep是另一种选择。 它通过JNI将CPython嵌入Java中。

import jep.Jep;

//...

try(Jep jep = new Jep(false)) {

jep.eval("s = 'hello world'");

jep.eval("print(s)");

jep.eval("a = 1 + 2");

Long a = (Long) jep.getValue("a");

}

Ariel answered 2020-06-18T01:14:27Z

1 votes

您可以尝试使用groovy。 它在JVM上运行,并为运行外部进程和提取输出提供了强大的支持:

[HTTP://groovy.code号AU是.org/executing+external+processes+from+groovy]

您可以从同一链接的此代码中看到,groovy如何使获取进程状态变得容易:

println "return code: ${ proc.exitValue()}"

println "stderr: ${proc.err.text}"

println "stdout: ${proc.in.text}" // *out* from the external program is *in* for groovy

txominpelu answered 2020-06-18T01:14:56Z

1 votes

首先,我建议使用ProcessBuilder(从1.5开始)

这里介绍了简单的用法

[HTTPS://stack overflow.com/啊/14483787]

有关更复杂的示例,请参阅

[HTTP://呜呜呜.Java world.com/article/2071275/core-Java/我很-runtime-exec---我能-他.HTML]

从Java启动Python脚本时遇到问题,脚本产生太多的输出以至标准输出,一切都变坏了。

partTimeNinja answered 2020-06-18T01:15:38Z

1 votes

Jython方法

Java应该是平台无关的,并且调用本机应用程序(例如python)也不是平台无关的。

有一个用Java编写的Python(Jython)版本,它允许我们将Python嵌入我们的Java程序中。 通常,当您要使用外部库时,一个障碍是编译并正确运行它,因此,我们完成了使用Jython构建和运行简单Java程序的过程。

我们首先获取jython jar文件:

[HTTP://呜呜呜.建议thon.org/downloads.HTML]

我将jython-2.5.3.jar复制到了Java程序所在的目录中。 然后,我输入以下程序,该程序与前两个程序相同; 取两个数字,将它们发送给python,然后将它们相加,然后python将其返回给我们的Java程序,该数字将输出到屏幕上:

import org.python.util.PythonInterpreter;

import org.python.core.*;

class test3{

public static void main(String a[]){

PythonInterpreter python = new PythonInterpreter();

int number1 = 10;

int number2 = 32;

python.set("number1", new PyInteger(number1));

python.set("number2", new PyInteger(number2));

python.exec("number3 = number1+number2");

PyObject number3 = python.get("number3");

System.out.println("val : "+number3.toString());

}

}

我将此文件称为“ test3.java”,将其保存,然后执行以下操作对其进行编译:

javac -classpath jython-2.5.3.jar test3.java

下一步是尝试运行它,我可以通过以下方式进行操作:

java -classpath jython-2.5.3.jar:。 测试3

现在,这使我们能够以独立于平台的方式使用Java中的Python。 这有点慢。 尽管如此,它还是一个用Java编写的Python解释器,还是很酷的。

DAVIS BENNY 15MIS0426 answered 2020-06-18T01:16:43Z

0 votes

最好的实现方法是使用Apache Commons Exec,因为即使在Java 8环境下我也可以在生产环境中使用它,因为它可以让您以synchronous和asynchronous的方式执行任何外部进程(包括python,bash等),这一点是可以实现的 使用看门狗。

CommandLine cmdLine = new CommandLine("python");

cmdLine.addArgument("/my/python/script/script.py");

DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();

ExecuteWatchdog watchdog = new ExecuteWatchdog(60*1000);

Executor executor = new DefaultExecutor();

executor.setExitValue(1);

executor.setWatchdog(watchdog);

executor.execute(cmdLine, resultHandler);

// some time later the result handler callback was invoked so we

// can safely request the exit value

resultHandler.waitFor();

这里共享了一个小而完整的POC的完整源代码,解决了本文中的另一个问题。

[HTTPS://GitHub.com/绕Hammad/external process from Java.git]

khawarizmi answered 2020-06-18T01:17:12Z

0 votes

ProcessBuilder非常易于使用。

ProcessBuilder pb = new ProcessBuilder("python","Your python file",""+Command line arguments if any);

Process p = pb.start();

这应该调用python。 有关完整示例,请参见此处的过程方法!

Palak answered 2020-06-18T01:17:37Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值