GVKun编程网logo

从Java调用python函数的不同/更好的方法(java调用python方法总结)

13

本文将分享从Java调用python函数的不同/更好的方法的详细内容,并且还将对java调用python方法总结进行详尽解释,此外,我们还将为大家带来关于Java函数与Python函数的区别?、Jav

本文将分享从Java调用python函数的不同/更好的方法的详细内容,并且还将对java调用python方法总结进行详尽解释,此外,我们还将为大家带来关于Java函数与Python函数的区别?、Java调用Python、java调用python:通过bat调用exe实现、java调用python代码的相关知识,希望对你有所帮助。

本文目录一览:

从Java调用python函数的不同/更好的方法(java调用python方法总结)

从Java调用python函数的不同/更好的方法(java调用python方法总结)

我是python的新手,正尝试从java调用python的函数。

我的主要要求是:

  • 调用应该是透明的,从某种意义上说,它不应.py仅需要修改文件就可以从Java对其进行调用。我可能会得到任何带有某些功能的python文件。我应该能够调用任何这些功能,而无需修改.py文件。
  • 我希望能够同时发送原语类型(的参数intStringfloats等等)或非原语类型(HashMapArrayList从Java)来Python函数和接收返回所返回的对象(其原始类型或非原始类型的可能)从蟒到Java。我也使用pandas DataFrame和numpy ndarray,因此也希望能够与Java发送和接收相应的对象。
  • 最好 还是坚持使用CPython而不是Jython,因为我可能需要使用Jython中可能没有的较新的库。

我在网上找到了几个选项。很少有:

  • 使用Jython的 PythonInterpreter,通过它我可以调用python函数,而无需对.py脚本文件进行任何更改:

py1.py

     def square2(list):     squares = []     for i in list:         squares.append(i*i)     return squares

JythonTest.groovy

     import org.python.util.PythonInterpreter import org.python.core.*; class JythonTest {      static main(def args)      {          PythonInterpreter pi = new PythonInterpreter()          pi.exec("from py1 import square2")          PyFunction pf = (PyFunction)pi.get("square2")          println pf.__call__(new PyList([1,2,3,4]))[2]   //9      } }

我非常有能力满足我的需求。但是它不是CPython。

  • 使用 ScriptEngine:这与PythonInterpreter非常相似。但是它的Jython又来了。而且,与PythonInterpreter不同,我们不能使用Jython 2.5+,也不能直接访问PyObjects。因此,可以很好地关闭此选项。

  • 使用 py4j:无法找到示例,与Jython PythonInterpreter一样最小

  • 使用 java2python。但是没有给出太多有关从java调用python的信息,因此我可以得出结论是否可以满足我的上述要求。谁能对此给予更多的了解?更具体地说,如果我们可以编写与Jython PythonInterpreter中的代码一样少的代码。
  • 使用 JPype:但是,快速浏览之后,我感到无法像Jython PythonInterpreter那样编写最少的代码。我也觉得该项目没有得到开发。是吗?

如果我正确理解上述所有方法,似乎Jython PythonInterpreter是最佳选择。我在抓住错误时是否犯了错误?还有其他更好的选择吗?

答案1

小编典典

目前尚无此问题的答案。使用CPython依赖于Python字节码的执行,这反过来又要求将Python解释器嵌入执行环境中。由于没有Java运行时附带嵌入式Python解释器,因此看起来Jython确实是最好的答案。

有时您想要的答案不可用!

Java函数与Python函数的区别?

Java函数与Python函数的区别?

java 和 python 函数的主要区别在于:参数传递方式:java 使用值传递,python 使用引用传递。返回值处理:java 必须使用 return 语句,python 函数的最后一行隐式返回。变量范围:java 在代码块内,python 可以全局访问。数据类型:java 为静态类型,python 为动态类型。

Java函数与Python函数的区别?

Java 函数与 Python 函数的区别

在 Java 和 Python 编程语言中,函数是基本构建块,用于执行特定任务或功能。虽然它们在功能上很相似,但是有一些关键区别需要考虑。

语法

立即学习“Java免费学习笔记(深入)”;

  • Java:public static void main(String[] args)
  • Python:def main():

参数传递

  • Java:使用值传递。函数接收原始变量的副本。
  • Python:使用引用传递。函数接收指向变量内存地址的引用。

返回值

  • Java:必须显式使用 return 语句返回一个值。
  • Python:函数的最后一行隐式返回一个值。

变量范围

  • Java:变量在定义它们的代码块内具有作用域。
  • Python:变量可以在定义它们的地方之外访问(全局范围)。

数据类型

  • Java:静态类型语言,强制类型检查。
  • Python:动态类型语言,在运行时检查类型。

实战案例

Java 代码:

public class Main {
    public static void main(String[] args) {
        int a = 10;
        int result = multiply(a, 5);
        System.out.println(result); // 输出:50
    }

    public static int multiply(int a, int b) {
        return a * b;
    }
}
登录后复制

Python 代码:

def main():
    a = 10
    result = multiply(a, 5)
    print(result)  # 输出:50

def multiply(a, b):
    return a * b

if __name__ == ''__main__'':
    main()
登录后复制

如你所见,Java 代码显式定义了返回类型和参数类型,而 Python 代码则没有。此外,Python 的变量可以在函数外访问,而 Java 的变量则不行。

以上就是Java函数与Python函数的区别?的详细内容,更多请关注php中文网其它相关文章!

Java调用Python

Java调用Python

今天遇到java调用一个python脚本的问题,纠结了大半天,遇到各种问题。网上搜索的大部分都是用jython,但是我想要调用的python脚本里有import urllib,这个urllib也不是什么第三方扩展库,在python的安装path下的lib下就有,在python命令行下肯定是能找到的。但是用jython的话,sys的path里面就太少了。示例代码:

import org.python.core.Py;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;
public class Test3 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        
        PythonInterpreter interpreter = new PythonInterpreter();  
        
        PySystemState sys = Py.getSystemState(); 
        //sys.path.add("D:\\jython2.5.2\\Lib");
        System.out.println(sys.path.toString()); 
        
        interpreter.exec("print 'hello'");  
        
        interpreter.exec("import sys");
        interpreter.exec("print sys.path");
        
//        interpreter.exec("import urllib");
//        interpreter.exec("print urllib");
    }
}
登录后复制

打印出来的sys.path为:

Txt代码

[''D:\\eclipse_jee_workspace\\ZLabTest\\lib\\Lib'', ''__classpath__'', ''__pyclasspath__/'']

这儿就只有eclipse的工程的路径包含了,所以当然找不到urllib啦。而在命令行下打印sys.path为:

立即学习“Java免费学习笔记(深入)”;

点击下载“修复打印机驱动工具”;


用jython差的lib库少太多了,也懒得用类似sys.path.add("D:\\jython2.5.2\\Lib");一个一个加了,所以果断放弃jython。

然后查到可以用Runtime.getRuntime().exec("python test.py");示例代码如下:

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Test5 {
        public static void main(String[] args){
                try{
                        System.out.println("start");
                        Process pr = Runtime.getRuntime().exec("python test.py");
                        
                        BufferedReader in = new BufferedReader(new
                                InputStreamReader(pr.getInputStream()));
                        String line;
                        while ((line = in.readLine()) != null) {
                            System.out.println(line);
                        }
                        in.close();
                        pr.waitFor();
                        System.out.println("end");
                } catch (Exception e){
                            e.printStackTrace();
                        }
                }
}
登录后复制

test.py的文件内容为:

Python代码

import sys  
import urllib  
print "hello"  
print sys.path
登录后复制

java程序运行的结果为:

Txt代码

start  
hello  
['D:\\eclipse_jee_workspace\\ZLabTest', 'C:\\Windows\\system32\\python27.zip', 'D:\\Python27\\DLLs', 'D:\\Python27\\lib', 
'D:\\Python27\\lib\\plat-win', 'D:\\Python27\\lib\\lib-tk', 'D:\\Python27', 'D:\\Python27\\lib\\site-packages']
end
登录后复制

 这就比较对了。但是中途还是遇到了很多问题,在Eclipse中运行上面的java程序抛出异常:

java.io.IOException: Cannot run program "python": CreateProcess error=2, ϵͳÕҲ»µ½ָ¶

at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)

at java.lang.Runtime.exec(Runtime.java:593)

at java.lang.Runtime.exec(Runtime.java:431)

at java.lang.Runtime.exec(Runtime.java:328)

at com.mysrc.Test5.main(Test5.java:10)

Caused by: java.io.IOException: CreateProcess error=2, ϵͳÕҲ»µ½ָ¶

at java.lang.ProcessImpl.create(Native Method)

at java.lang.ProcessImpl.(ProcessImpl.java:81)

at java.lang.ProcessImpl.start(ProcessImpl.java:30)

at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)

... 4 more

就是没法调用python程序,而如果是在命令行下用javac编译,然后java执行的话肯定是对的。怎么才能在Eclipse里也能正常运行了,网上查了半天,在run configurations->environment新建一个PATH,值设为安装的python的路径,再运行就OK了。

java调用python:通过bat调用exe实现

java调用python:通过bat调用exe实现

bat文件测试

echo hello world!
pause
md e:\test

工程需要的bat文件

C:\**\**\**\**为python的地址
@echo off
::set INTERVAL = 10
::timeout %INTERVAL%
::Again   

echo local_cap  
C:
cd C:\**\**\**\**
start python  chengxu\juzhentezheng.py
pause
rem 使用ping命令暂停3s,这样可以看到调用python后的结果
::ping -n 10 127.0.0.1 > nul 

java调用代码


import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;




try {
		StringBuilder sb = new StringBuilder();
		String batPath = "C:/helloworld.bat";
		Process child = Runtime.getRuntime().exec(batPath);
		InputStream in = child.getInputStream();
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
		String line;
		while ((line = bufferedReader.readLine()) != null) {
			sb.append(line + "\n");
		}
		in.close();
		try {
			child.waitFor();
		} catch (InterruptedException e) {
			System.out.println(e);
		}
        } catch (IOException e) {
            System.out.println(e);
        }

运行结果

在这里插入图片描述

java调用python代码

java调用python代码

python代码:

 

 

java代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.python.core.Py;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter; 


public class JavaPythonUtils {
    public static void main(String[] args) throws IOException, InterruptedException {     
        try{             
        System.out.println("start");             
        Process pr = Runtime.getRuntime().exec("C:\\Users\\WJX\\AppData\\Local\\Programs\\Python\\Python35\\python.exe  E:\\PycharmProjects\\SkinCareRecommendation\\venv\\Include\\diaoyong.py");                         
        BufferedReader in =new BufferedReader(new InputStreamReader(pr.getInputStream()));             
        String line;             
        while((line = in.readLine()) !=null) {                 
            System.out.println(line);             
            }                      
        in.close();             
        pr.waitFor();               
        System.out.println("end");    
        }catch(Exception e){                 
            e.printStackTrace();            
            }   
    }
}

 

将jython.jar包build path:

 

 

 

 

 

注:

        Process pr = Runtime.getRuntime().exec("C:\\Users\\WJX\\AppData\\Local\\Programs\\Python\\Python35\\python.exe  E:\\PycharmProjects\\SkinCareRecommendation\\venv\\Include\\diaoyong.py");                         

 此句中的参数第一个地址为你要调用python文件所使用的python.exe,如果使用的是pycharm建的python项目,则可从setting里面找到使用的python.exe路径:

 

若路径不一致,则可能导致想调用的python中本来应输出的信息无法输出。

原因:这里调用出现的问题主要是第三方包的问题,因为你的py文件里可能含有很多三方库文件,jython的jar包里可能不含有这个,所以这时需要你找到你已有三方库文件的exe,

怎么找呢,去你的pycharm里找,不然java会调用计算机默认的python去做,而你可能只是把三方库文件下载到了某一个程序里,计算机默认的python可能并不包含你所调用的第三方库文件。

 

 正确输出如图:

 

今天关于从Java调用python函数的不同/更好的方法java调用python方法总结的分享就到这里,希望大家有所收获,若想了解更多关于Java函数与Python函数的区别?、Java调用Python、java调用python:通过bat调用exe实现、java调用python代码等相关知识,可以在本站进行查询。

本文标签: