jpython的使用(Java调用python脚本)

作者: 旋哥 | 来源:发表于2017-09-02 12:41 被阅读4455次

    1、导入Jar

    jar下载地址

    找到jython-installer-2.7.0.jar 包里面的jpython.jar,加载到工作目录

    我用的java开发工具是IDEA、JDK8、Python3.5

    2 、执行python源码

    获取一个元组里面的元素

    import org.python.util.PythonInterpreter;
    public class FirstJavaScript {
        public static void main(String args[]) {
    
            PythonInterpreter interpreter = new PythonInterpreter();
            interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");
            interpreter.exec("print days[1];");
    
        }// main
    }
    
    

    一般会出现以下异常

    Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site
    Determine if the following attributes are correct:
      * sys.path: ['C:\\Users\\Administrator\\IdeaProjects\\MyText\\lib\\Lib', '__classpath__', '__pyclasspath__/']
        This attribute might be including the wrong directories, such as from CPython
      * sys.prefix: C:\Users\Administrator\IdeaProjects\MyText\lib
        This attribute is set by the system property python.home, although it can
        be often automatically determined by the location of the Jython jar file
    
    You can use the -S option or python.import.site=false to not import the site module
    
    

    看错误可以理解为一些库的路径错误,下面也给出了解决方法

    我们只需要吧代码改为以下这个例子就可以顺利执行了。

    Properties props = new Properties();
         props.put("python.home", "path to the Lib folder");
         props.put("python.console.encoding", "UTF-8");
         props.put("python.security.respectJavaAccessibility", "false");
         props.put("python.import.site", "false");
         Properties preprops = System.getProperties();
         PythonInterpreter.initialize(preprops, props, new String[0]);
    
    
         PythonInterpreter interpreter = new PythonInterpreter();
         interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");
         interpreter.exec("print days[1];");
    
    

    执行结果是Tue

    3、调用.py中的方法

    test.py的源码

    def add(a, b):
        return a + b
    

    Java源码

    Properties props = new Properties();
         props.put("python.home", "path to the Lib folder");
         props.put("python.console.encoding", "UTF-8");
         props.put("python.security.respectJavaAccessibility", "false");
         props.put("python.import.site", "false");
         Properties preprops = System.getProperties();
         PythonInterpreter.initialize(preprops, props, new String[0]);
    
         PythonInterpreter interpreter = new PythonInterpreter();
         interpreter.execfile("test.py");
         PyFunction func = (PyFunction) interpreter.get("adder",
                 PyFunction.class);
    
         int a = 100, b = 100;
         PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));
         System.out.println("anwser = " + pyobj.toString());
    
    

    执行结果为 200

    4、执行 .py文件

    test.py

    # -*- coding: utf-8 -*
    
    print ("hello")
    ls = [1,2,3,4,5,6]
    print(ls)
    print('你好')
    

    java代码

    
    Properties props = new Properties();
        props.put("python.home", "path to the Lib folder");
        props.put("python.console.encoding", "UTF-8");
        props.put("python.security.respectJavaAccessibility", "false");
        props.put("python.import.site", "false");
        Properties preprops = System.getProperties();
        PythonInterpreter.initialize(preprops, props, new String[0]);
    
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.execfile("test.py");
    
    
    

    执行结果:

    hello
    [1, 2, 3, 4, 5, 6]
    你好
    

    如果报出如下异常,请在源码加上
    # -- coding: utf-8 -

    Exception in thread "main" SyntaxError: Non-ASCII character in file
    

    相关文章

      网友评论

        本文标题:jpython的使用(Java调用python脚本)

        本文链接:https://www.haomeiwen.com/subject/luzljxtx.html