本文将分享从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
- java调用python:通过bat调用exe实现
- java调用python代码
从Java调用python函数的不同/更好的方法(java调用python方法总结)
我是python的新手,正尝试从java调用python的函数。
我的主要要求是:
- 调用应该是透明的,从某种意义上说,它不应
.py
仅需要修改文件就可以从Java对其进行调用。我可能会得到任何带有某些功能的python文件。我应该能够调用任何这些功能,而无需修改.py
文件。 - 我希望能够同时发送原语类型(的参数
int
,String
,floats
等等)或非原语类型(HashMap
,ArrayList
从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 和
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脚本的问题,纠结了大半天,遇到各种问题。网上搜索的大部分都是用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.
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实现
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代码
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代码等相关知识,可以在本站进行查询。
本文标签: