调用C语言
三个步骤:
1、编写好c语言程序
2、将c程序编译成.so文件
3、编写python,使用python运行
第一步,写一个c语言文件
#include<stdio.h>
int test()
{
printf("hello,world");
}
第二步,将编写的C代码编译成动态链接库的形式,打开cmd,cd路径到add.c所在目录下方,然后输入:
gcc --shared -fpic -o add.so add.c
每个平台将c文件编译成so文件的命令都不同,我这个是windows下的命令。其它的例如Linux等OS命令请自行查询命令资料。
第三步、在hello.py中导入动态链接库,并调用C函数
这里的ctypes是Python的一个外部库,提供和C语言兼容的数据类型,以方便的调用C编译的静态库和动态库中的函数, 在此可以很肯定的说,ctypes中可定对C的数据类型进行了转换,使用时只需import ctypes ,然后导入动态库即可。
ctypes详细介绍http://www.92to.com/bangong/2016/08-08/9334057.html
import ctypes
lib = ctypes.cdll.LoadLibrary('./libhello.so')
lib.test()
在终端下输入Python hello.py, 运行结果:
打印出hello.c中的内容, 说明Python调用C模块成功!
调用java语言
安装
python -m pip install jpype1
pythonIDE
python3.6
java1.8
eclipse4.6.3 PyDev(python在eclipse插件)
HelloWord
- 设置参数启动Java虚拟机
- 运行Java代码
- 关闭虚拟机
#coding=utf=8
import jpype
jvmPath = jpype.getDefaultJVMPath() # 获得系统的jvm路径
jpype.startJVM(jvm=jvmPath) # 启动虚拟机
# 执行JAVA代码
jpype.java.lang.System.out.println("hello world")
jpype.shutdownJVM() # 关闭jvm
第一种:jpype支持直接使用Java编译后的class文件。
package com;
public class JavaClass
{
String value;
public JavaClass(String value)
{
this.value = value+" Java";
}
public String getValue()
{
return this.value;
}
public void say()
{
System.out.println("hello java");
}
public static void main(String[] args) {
System.out.println("hello world");
}
}
随后生成class文件
python代码
#coding=utf=8
import jpype
# 获得系统的jvm路径
jvmPath = jpype.getDefaultJVMPath()
# 启动虚拟机
if not jpype.isJVMStarted():
jpype.startJVM(jvm=jvmPath)
# 使用JAVA字节码中定义的类
javaClass = jpype.JClass('com.JavaClass')
# 实例化对象
javaInstance = javaClass('test')
#调用JAVA对象的方法
print (javaInstance.getValue())
javaInstance.say()
# 关闭jvm
jpype.shutdownJVM()
第二种:jpype也支持直接使用Java程序打包后的jar文件。
教大家一种打包的方法,我以前是写web前端的,用习惯了eclipse,所以我的python工具也是eclipse,感兴趣的可以跳到我配置eclipse+python环境的博客。
我们在eclipse编写完java程序后呢,在自己程序的包上面 右键 菜单中有一个 Export 的功能,点击完之后,就可以选择输出格式和路径了,我这里选择的是 java – JAR file
package test;
public class Test1
{
public String getKey(String key){
return key;
}
public void printData(String key){
System.out.println(key);
}
public static void main(String[] args)
{
System.out.println(456);
}
}
python代码
import jpype
#获取系统jvm路径
jvmPath = jpype.getDefaultJVMPath()
# 用来添加JAVA虚拟机命令行参数
ext_classpath = './Test1.jar'
jvmArg = '-Djava.class.path=' + ext_classpath
if not jpype.isJVMStarted():
jpype.startJVM(jvmPath, jvmArg)
TA = jpype.JPackage('test').Test1 #这种用法可以简化后面的书写
jd = TA()
jd.printData('1234')
s = jd.getkey('a')
print (s)
system = jpype.java.lang.System #直接获取java内置输出实例
system.out.println("call system method")
jpype.shutdownJVM()