在 Java 中调用 Python 3.x 函数

Far*_*ram 5 python java module python-3.x

我想在Java中调用Python函数。我知道有 Jython,它附带了 Java 的 PythonInterpreter,但遗憾的是它只支持 Python 2.7。

为了更好地解释我想做的事情。假设给定文件中有以下 Python 代码:

@staticmethod
def my_first_function():
   print("Hi!")

@staticmethod
def my_second_function():
   print("Hi again!")
Run Code Online (Sandbox Code Playgroud)

我现在希望能够在 Java 中显式调用这样的函数:

PythonToJava pythonToJava = new PythonToJava("my/python/script/path");
pythonToJava.my_second_function(); 
pythonToJava.my_first_function();
Run Code Online (Sandbox Code Playgroud)

我如何使用/调用Python模块/脚本/类/等。在Java中?

Giu*_*ioP 4

使用 Runtime.exec() 方法怎么样?做就是了Process process = Runtime.getRuntime().exec("python script.py arg1 arg2")。Runtime 是 java.lang 包中的一个类,因此您不需要进行任何花哨的导入。

更多信息请点击这里。

编辑

好吧,如果你有很多功能,管理起来就不太容易了。另一方面,如果您不介意一堆包装器文件,只需执行一些代码即可为每个函数自动构建一个包装器文件。

查看这一小段 Python 代码。只需替换foo为您的大模块的名称即可,然后就可以开始了。

from inspect import getmembers, isfunction
import foo

f_list=[o[0] for o in getmembers(foo) if isfunction(o[1])]
for x in f_list:
    print("Build "+str(x))
    with open("helper_"+str(x)+".py","wt") as f:
        f.write("""import foo
import sys

arg_list=sys.argv[1::]
print(foo.{x}(*arg_list))""".format(x=x))
Run Code Online (Sandbox Code Playgroud)

  • 这正是我不想做的。这里的问题是,我无法调用特定的函数。我有一个包含数百个函数的 Python 模块。我希望能够单独给他们打电话。我知道我可以使用参数(以及 python 脚本中的 switch case)来做到这一点,或者我可以将每个函数放在一个单独的文件中,但这会很疯狂。考虑到我需要时不时地进行调试,这也是一个有问题的方法。 (2认同)