使用Jython在Java中运行Python程序

使用Jython在Java中运行Python程序,java,python,jython,Java,Python,Jython,我编写了一个Python程序,由五个.py脚本文件组成。 我想在Java应用程序中执行这些python脚本的主要部分 我的选择是什么?使用PythonInterpreter不起作用,例如,无法从Jython加载datetime模块(我不希望用户确定这些依赖项的Python路径) 我使用Jython的compileall将整个文件夹编译成.class文件。我是否可以以某种方式嵌入这些.class文件以从Java应用程序中执行主文件,或者如何继续?查看Java中的ProcessBuilder类: j

我编写了一个Python程序,由五个.py脚本文件组成。 我想在Java应用程序中执行这些python脚本的主要部分

我的选择是什么?使用PythonInterpreter不起作用,例如,无法从Jython加载
datetime
模块(我不希望用户确定这些依赖项的Python路径)


我使用Jython的compileall将整个文件夹编译成.class文件。我是否可以以某种方式嵌入这些.class文件以从Java应用程序中执行主文件,或者如何继续?

查看Java中的ProcessBuilder类:

java构造函数中使用的命令应该与在命令行中键入的命令相同。例如:

Process p = new ProcessBuilder("python", "myScript.py", "firstargument").start();
(process builder执行与python
子流程
模块相同的操作)

看看


注意:关于问题的Jython部分,如果你去Jython网站(查看他们网站www.Jython.org的FAQ部分)。检查条目“use jython from java”。

我还对直接在java中运行Python代码感兴趣,使用并避免安装Python解释器

文章“”解释了如何引用外部的
*.py
Python脚本,并将参数传递给它,无需安装Python解释器:

#pymodule.py - make this file accessible to your Java code
def square(value):
return value*value
然后,可以通过创建 执行它,或者通过检索指向函数的指针并调用 其调用具有正确参数的方法:

  • Jython的Maven/Gradle/etc依赖项字符串可以在


可以加载其他模块。您只需要指定可以在其中找到自定义模块的python路径。请参阅下面的测试用例,我正在调用函数(my_math())中使用Python datatime/math模块,我在Python.path中有多个Python文件,这些文件由main.py导入

@Test
public void testJython() {

    Properties properties = System.getProperties();
    properties.put("python.path", ".\\src\\test\\resources");
    PythonInterpreter.initialize(System.getProperties(), properties, new String[0]);

    PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.execfile(".\\src\\test\\resources\\main.py");

    interpreter.set("id", 150); //set variable value
    interpreter.exec("val = my_maths(id)"); //the calling function in main.py

    Integer returnVal = (Integer) interpreter.eval("val").__tojava__(Integer.class);
    System.out.println("return from python: " + returnVal);
}

我认为Jython是为了让您可以将Java工具包括到Python中,而不是反过来…@cricket_007 Jython是JVM的Python实现。您可以主要使用任何一种语言进行编程,也可以进行互操作。从java调用.vbs文件并使该.vbs文件调用python文件如何。在这种情况下,我需要再次确保用户安装了python 2.x,以便我的脚本正常工作,它已注册为“python”命令,最后我需要在硬盘上的某个位置提取脚本。这不是我想要的,我将看一看Jython。虽然这是有用的信息,但这似乎并不能直接回答使用Java/Jython中的Python代码的问题,而不需要安装Python运行时。请看我上面的答案,它更适合在Python脚本中执行特定函数。在的答案明确地解释了如何通过Jython将参数传递给Python脚本,就像从CLi传递参数一样(不了解脚本的内部结构,只了解命令行)。我可以修改我的回答以反映这一新信息。
@Test
public void testJython() {

    Properties properties = System.getProperties();
    properties.put("python.path", ".\\src\\test\\resources");
    PythonInterpreter.initialize(System.getProperties(), properties, new String[0]);

    PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.execfile(".\\src\\test\\resources\\main.py");

    interpreter.set("id", 150); //set variable value
    interpreter.exec("val = my_maths(id)"); //the calling function in main.py

    Integer returnVal = (Integer) interpreter.eval("val").__tojava__(Integer.class);
    System.out.println("return from python: " + returnVal);
}