py4j:如何从 Python 启动 java 网关
py4j: how to launch the java Gateway from Python
我可以在 Python 中与我的示例 Java 程序进行交互,方法是打开我的 Java 程序,然后使用以下 Python 代码:
from py4j.java_gateway import JavaGateway
gg = JavaGateway()
sw = gg.entry_point.getInstance()
sw.run()
...
然而,这样做的缺点是我必须在使用此代码之前以某种方式打开 Java 程序。
我发现有一个方法叫做launch_gateway,这个方法看起来很方便。
py4j.java_gateway.launch_gateway(jarpath="path_to_my_jar.jar")
但是,如果以这种方式启动,我无法连接到我的 Java 程序。
我尝试使用以下代码:
port = py4j.java_gateway.launch_gateway(jarpath="path_to_my_jar.jar")
gp = GatewayParameters(port=port)
gg = JavaGateway(gateway_parameters=gp)
sw = gg.entry_point.getInstance()
但我收到以下错误:
An error occurred while calling t.getInstance. Trace:
py4j.Py4JException: Target Object ID does not exist for this gateway :t
我想我尝试连接网关的方式有问题。
有什么建议吗?
谢谢
我看到两个潜在的问题:
- jarpath 应该是 Py4J 的 jar 路径。您可以在 launch_gateway.
的类路径参数中添加您的库
- 当您从 launch_gateway 开始 py4j.GatewayServer 时,没有指定入口点,所以 entry_point do
巴泰勒米,你是对的!我最初误解了它是如何工作的。
launch_gateway
在py4j.jar 中运行网关,这对于与标准 JVM 交互很有用,但显然不包含自定义代码。
但是,正如您所建议的,classpath
参数允许您加载额外的自定义 Java 代码。
这是一个"minimal example":
from py4j.java_gateway import JavaGateway
gg = JavaGateway.launch_gateway(classpath="/path/my_jar.jar")
myclass_instance = gg.jvm.my_class_package_name.MyClass()
result = myclass_instance.my_method()
请注意 my_jar.jar
不必启动网关。
launch_gateway
为您提供不错的功能,例如:die_on_exit
、stdout/stdin 重定向和自动端口选择。
我可以在 Python 中与我的示例 Java 程序进行交互,方法是打开我的 Java 程序,然后使用以下 Python 代码:
from py4j.java_gateway import JavaGateway
gg = JavaGateway()
sw = gg.entry_point.getInstance()
sw.run()
...
然而,这样做的缺点是我必须在使用此代码之前以某种方式打开 Java 程序。
我发现有一个方法叫做launch_gateway,这个方法看起来很方便。
py4j.java_gateway.launch_gateway(jarpath="path_to_my_jar.jar")
但是,如果以这种方式启动,我无法连接到我的 Java 程序。
我尝试使用以下代码:
port = py4j.java_gateway.launch_gateway(jarpath="path_to_my_jar.jar")
gp = GatewayParameters(port=port)
gg = JavaGateway(gateway_parameters=gp)
sw = gg.entry_point.getInstance()
但我收到以下错误:
An error occurred while calling t.getInstance. Trace:
py4j.Py4JException: Target Object ID does not exist for this gateway :t
我想我尝试连接网关的方式有问题。
有什么建议吗?
谢谢
我看到两个潜在的问题:
- jarpath 应该是 Py4J 的 jar 路径。您可以在 launch_gateway. 的类路径参数中添加您的库
- 当您从 launch_gateway 开始 py4j.GatewayServer 时,没有指定入口点,所以 entry_point do
巴泰勒米,你是对的!我最初误解了它是如何工作的。
launch_gateway
在py4j.jar 中运行网关,这对于与标准 JVM 交互很有用,但显然不包含自定义代码。
但是,正如您所建议的,classpath
参数允许您加载额外的自定义 Java 代码。
这是一个"minimal example":
from py4j.java_gateway import JavaGateway
gg = JavaGateway.launch_gateway(classpath="/path/my_jar.jar")
myclass_instance = gg.jvm.my_class_package_name.MyClass()
result = myclass_instance.my_method()
请注意 my_jar.jar
不必启动网关。
launch_gateway
为您提供不错的功能,例如:die_on_exit
、stdout/stdin 重定向和自动端口选择。