从Python脚本调用Java文件时出现TypeError错误求助
解决Py4J调用Java类时出现的
TypeError: 'JavaPackage' object is not callable错误 这个错误本质是Py4J找不到你定义的ExampleWithField Java类,所以返回了一个JavaPackage对象而非可实例化的Java类,导致你尝试创建实例时失败。下面是一步步的解决方法:
1. 确保Java类已正确编译
首先,你需要把你的Java代码编译成.class文件:
javac ExampleWithField.java
执行完这个命令后,当前目录下会生成ExampleWithField.class文件。
2. 让Py4J的Java网关能找到这个类
Py4J的工作机制是Python客户端连接到一个运行中的Java GatewayServer,所以你需要确保GatewayServer能加载到你的ExampleWithField类。有两种常见方式:
方式一:编写Gateway启动类
创建一个简单的Java类来启动GatewayServer,并把你的类实例作为服务对象暴露:
import py4j.GatewayServer; public class GatewayStarter { public static void main(String[] args) { // 实例化你的类并传递给GatewayServer GatewayServer gatewayServer = new GatewayServer(new ExampleWithField()); gatewayServer.start(); System.out.println("Py4J Gateway Server is running..."); } }
然后编译这个启动类(需要把Py4J的jar包加到类路径,比如你用的是py4j0.10.9.7.jar):
# Linux/macOS javac -cp py4j0.10.9.7.jar GatewayStarter.java # Windows javac -cp py4j0.10.9.7.jar GatewayStarter.java
最后启动GatewayServer:
# Linux/macOS java -cp .:py4j0.10.9.7.jar GatewayStarter # Windows(注意用分号分隔类路径) java -cp .;py4j0.10.9.7.jar GatewayStarter
方式二:直接用命令行启动GatewayServer
如果你不想写启动类,可以直接用Py4J提供的GatewayServer命令行工具,指定类路径包含你的.class文件:
# Linux/macOS java -cp .:py4j0.10.9.7.jar py4j.GatewayServer --classpath . # Windows java -cp .;py4j0.10.9.7.jar py4j.GatewayServer --classpath .
3. 修正Python代码(适配Python3)
你的Python代码里print c是Python2的语法,Python3需要改成print(c),修正后的代码:
from py4j.java_gateway import JavaGateway gateway = JavaGateway() example = gateway.jvm.ExampleWithField() c = example.member() print(c)
4. 验证运行顺序
一定要先启动Java的GatewayServer,再运行你的Python脚本,这样Python客户端才能连接到运行中的网关并找到你的Java类。
内容的提问来源于stack exchange,提问作者ParvezAalam Mevegar
相关产品推荐
相关产品推荐

