用java调用python脚本,单独的python脚本可以运行,但是在java里面调用的时候告知缺少模块。怎么破?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java调用python脚本,单独的python脚本可以运行,但是在java里面调用的时候告知缺少模块。怎么破?相关的知识,希望对你有一定的参考价值。

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("E:/Java/protein_prediction/src/test_tiger.py");
调用代码,可是问题如上

因为你调用的test_tiger.py需要加载python里面的module,而java调用的时候这里的py脚本的模块都要加到python的环境变量里面。 参考技术A 环境变量 ! 要重新设置追问

请问你有没有相关开发经验,还是只是说说。

追答

// 将 Jython 库加入系统的 classpath 中或直接通过这种方式动态引入
PythonInterpreter interpreter=new PythonInterpreter();
PySystemState sys = Py.getSystemState();
sys.path.add("E:\\jython\\Lib");

追问

这个我已经把jython.jar加入到我的配置路径了。这一步应该不需要,况且找不到的模块是另外安装的。

python模块

模块介绍

为什么用模块

在代码量庞大的时候,如果靠一个脚本来进行函数式编程,对于脚本的可读性及后期脚本的维护带来极大的不便,而且无法分辨函数间的调用关系,所以,可以将一组功能类似的函数单独放在一个py文件里,在主py文件进行调用。这样既可以提高可读性,哪个流程出问题了,很快就定位到函数了,也便于维护。而这个由多个功能类似的函数堆积成的脚本,就简单称之为模块

如何导入

  • import 指令 使用import命令导入模块。会将模块所有对象导入到当前命名空间中,调用模块里对象时,需加模块名,如 sys.path,即调用sys模块的path对象。python有一个定义模块位置的变量,即sys.path,
>>> import sys
>>> sys.path
[‘‘, /usr/local/python3/lib/python35.zip, /usr/local/python3/lib/python3.5, /usr/local/python3/lib/python3.5/plat-linux, /usr/local/python3/lib/python3.5/lib-dynload, /usr/local/python3/lib/python3.5/site-packages]

 

当python解释器遇到import指令时,会先在当前脚本目录查找指令后面的模块名,如果没有会继续按sys.path里定义的位置依次查找,直到找到这个模块为止,如果到最后没查找到,python会报一个模块找不到的错误

import prettytable
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named prettytable

 

  • from ... import 指令

该指令会将模块中导入一个指定的部分到当前命名空间中,在调用函数对象时,可直接使用函数对象名,不需要加函数名。此用法一般用于要导入的模块里对象和本脚本中对象命名有冲突时候,至加载需要的模块对象,也可以使用as 将此对象重命名,如

>>> from sys import path
>>> path
[‘‘, /usr/local/python3/lib/python35.zip, /usr/local/python3/lib/python3.5, /usr/local/python3/lib/python3.5/plat-linux, /usr/local/python3/lib/python3.5/lib-dynload, /usr/local/python3/lib/python3.5/site-packages]
>>> from sys import path as abc
>>> abc
[‘‘, /usr/local/python3/lib/python35.zip, /usr/local/python3/lib/python3.5, /usr/local/python3/lib/python3.5/plat-linux, /usr/local/python3/lib/python3.5/lib-dynload, /usr/local/python3/lib/python3.5/site-packages]

 

  • from ... import * 指令

和import 导入方法一样。只不过调用的时候不需要加模块名

>>> from sys import *
>>> path
[‘‘, /usr/local/python3/lib/python35.zip, /usr/local/python3/lib/python3.5, /usr/local/python3/lib/python3.5/plat-linux, /usr/local/python3/lib/python3.5/lib-dynload, /usr/local/python3/lib/python3.5/site-packages]
>>> version
3.5.1 (default, Jun  5 2016, 16:46:00) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)]

 

PS:自定义模块命名需要规范,不能和python内置的模块名重合,否则,将优先调用当前代码目录下的模块,造成python内置模块不能使用

以上是关于用java调用python脚本,单独的python脚本可以运行,但是在java里面调用的时候告知缺少模块。怎么破?的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本调用python处理中文错误的问题

如何在网页中调用python脚本?

java调用python问题

(转)java调用python脚本

Java 调用python说明文档

怎么在python脚本中调用其它的python脚本运行?