如果 py4j JVM 正在运行,那么在 python 中进行测试的最佳方法是啥?

Posted

技术标签:

【中文标题】如果 py4j JVM 正在运行,那么在 python 中进行测试的最佳方法是啥?【英文标题】:Best way to test in python if a py4j JVM is running?如果 py4j JVM 正在运行,那么在 python 中进行测试的最佳方法是什么? 【发布时间】:2013-05-17 04:39:59 【问题描述】:

如果运行 py4j 的 JVM 正在侦听所选(可能是默认)套接字,那么测试(在 python 脚本中)的好方法是什么?有点像智能ping

我可以尝试从我的 Java 类中访问方法或对象并捕获生成的 socket.error 异常,但这似乎有点像 hack。

在没有任何 JVM 的情况下创建一个 python JavaGateway 实例不会引发异常。我可能错过了一些东西,但我在the docs 中没有找到任何东西。

【问题讨论】:

【参考方案1】:

Py4J 没有运行状况检查、ping 或版本命令,因此测试 Py4J 是否正在侦听的唯一三个选项是:

    尝试连接到套接字。此方法并不完美,因为另一个服务器程序可能正在侦听默认端口。

    尝试加载JavaGateway(将在0.8版本中可用。现在仅在github上的master分支中可用):

    from py4j.java_gateway import JavaGateway, Py4JNetworkError
    try:
        java_gateway = JavaGateway(eager_load=True)    
        print("JVM accepting connection")
    except Py4JNetworkError:
        print("No JVM listening")
    except Exception:
        print("Another type of problem... maybe with the JVM")
    

    在 Py4J 0.7 中,尝试调用一个基本的 System 方法:

    from py4j.java_gateway import JavaGateway, Py4JNetworkError
    
    java_gateway = JavaGateway()    
    try:
        java_gateway.jvm.System.getProperty("java.runtime.name")
        print("JVM accepting connection")
    except Py4JNetworkError:
        print("No JVM listening")
    except Exception:
        print("Another type of problem... maybe with the JVM")
    

欢迎Feature requests!

【讨论】:

如果编译的结果是“没有 JVM 监听”我们应该怎么办? 可能是JVM中的GatewayServer没有启动。您可以使用 launch_gateway 函数从 Python 启动 GatewayServer/JVM。 还有没有其他解决办法?不知道我是否有太多开销,但我有一个 java 应用程序需要调用一个使用 python 库的 python 方法。我用监听器示例对其进行了测试 - 更改了一些代码。但是现在我要么一直运行网关,并在两侧永久保留引用,要么每次在我需要调用新脚本时启动 python 脚本 - 这里也许我多次启动相同的 python 脚本?也许有一个我只是不明白的简单解决方案。使用 CallbackServerParameters,这里急切是真的

以上是关于如果 py4j JVM 正在运行,那么在 python 中进行测试的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Py4J 的开销比 Jython 和 JPype 大

py4j.protocol.Py4JError: org.apache.spark.api.python.PythonUtils.getEncryptionEnabled 在 JVM 中不存在

如何停止 Python 运行 Py4J ClientServer

Java InputStream 到 Python (PY4J)

使用 Pyspark 运行 Python 脚本时出现 py4j.protocol.Py4JJavaError [重复]

如何使用 PY4J 从 python 调用 java