在Java中使用Jython调用Python脚本遇到的各种问题

使用Jython调用Python程序时,由于Python程序使用了numpy库等,而使用java时不会自动导入库,需要手动设置路径。

参考:

https://blog.csdn.net/xfei365/article/details/50996727

https://bbs.csdn.net/topics/392314370?page=1

https://blog.csdn.net/u010882234/article/details/74352492

 

手动导入报错Jython ImportError: No module named numpy

是因为本地没有相应的库,需要安装,安装numpy需要先安装Python

 

然而安装了Python之后,安装numpy时报错Python version x.x required, which was not found in the registry

这是注册表里找不到,参考以下网址操作即可:

参考:

https://blog.csdn.net/cakecc2008/article/details/53995665

https://blog.csdn.net/pppii/article/details/48679403

https://blog.csdn.net/u014595019/article/details/48013999

 

然而装上以后报错

Exception in thread "main" Traceback (most recent call last):
  File "D:\rosia\GitLocal\dip\dip-engine\mh.py", line 3, in <module>
    import numpy
  File "E:\Python27\Lib\site-packages\numpy\__init__.py", line 168, in <module>
    from . import add_newdocs
  File "E:\Python27\Lib\site-packages\numpy\add_newdocs.py", line 13, in <module>
    from numpy.lib import add_newdoc
  File "E:\Python27\Lib\site-packages\numpy\lib\__init__.py", line 8, in <module>
    from .type_check import *
  File "E:\Python27\Lib\site-packages\numpy\lib\type_check.py", line 11, in <module>
    import numpy.core.numeric as _nx
  File "E:\Python27\Lib\site-packages\numpy\core\__init__.py", line 6, in <module>
    from . import multiarray
ImportError: cannot import name multiarray

原因是numpy里面有的文件不是py后缀,是pyd文件,Jython无法导入。

参考:

https://stackoverflow.com/questions/3097466/using-numpy-and-cpython-with-jython

https://stackoverflow.com/questions/316410/is-there-a-good-numpy-clone-for-jython

https://stackoverflow.com/questions/30215271/how-to-setup-numpy-in-jython?lq=1

解决办法是使用java的库代替python的第三方库numpy

选择了jblas

GitHub地址:https://github.com/mikiobraun/jblas

jar包下载:http://jblas.org/download.html

放在本地库中

maven pom依赖:

<dependency>
        <groupId>org.jblas</groupId>
        <artifactId>jblas</artifactId>
        <version>1.2.4</version>
</dependency>

python文件中import numpy改为from org.jblas import DoubleMatrix

使用到的zeros ones transpose dot方法在DoubleMatrix类中都有,将python脚本中的numpy替换为DoubleMatrix即可

 

总结:整个过程是一波三折,解决一个问题又来一个问题,这样层层递进。回过头去看,前面几个问题都不用去解决,直接替换成java类库就可以。关于numpy,解决办法不止这一个。有JyNI,还没有实现,jep、jpy找不到怎么操作,java类库除了选用的jblas还有matrix-toolkits-java。很多问题还是要到stackoverflow上找,丰富一点,中文的网上就比较难找到。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java使用Jython编写Python代码示例: 1. 导入Jython库和Python模块 ```java import org.python.util.PythonInterpreter; import org.python.core.*; // 创建Python解释器 PythonInterpreter interp = new PythonInterpreter(); // 导入Python模块 interp.exec("import math"); ``` 2. 执行Python脚本 ```java // 执行Python脚本 interp.exec("result = 2 + 2"); // 获取Python变量 PyObject result = interp.get("result"); // 输出结果 System.out.println(result); ``` 3. 调用Python函数 ```java // 定义Python函数 interp.exec("def add(x, y):\n\treturn x + y"); // 调用Python函数 PyObject add = interp.get("add"); PyObject result = add.__call__(new PyInteger(2), new PyInteger(3)); // 输出结果 System.out.println(result); ``` 4. 使用Java对象作为Python参数 ```java // 定义Java对象 public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } // 创建Java对象 Person person = new Person("Tom", 20); // 注册Java对象到Jython interp.set("person", PyJavaType.wrapJavaObject(person)); // 调用Python函数,传入Java对象作为参数 PyObject func = interp.eval("lambda p: 'Name: %s, Age: %d' % (p.getName(), p.getAge())"); PyObject result = func.__call__(interp.get("person")); // 输出结果 System.out.println(result); ``` 5. 在Python调用Java方法 ```java // 定义Java类 public class Calculator { public static int add(int x, int y) { return x + y; } } // 注册Java类到Jython interp.exec("import sys"); interp.exec("sys.path.append(\".\")"); interp.set("Calculator", PyJavaType.wrapJavaClass(Calculator.class)); // 在Python调用Java方法 interp.exec("result = Calculator.add(2, 3)"); // 获取Python变量 PyObject result = interp.get("result"); // 输出结果 System.out.println(result); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值