java中调用Python__C中调用Python

来源:互联网 发布:淘宝一键复制赚佣金 编辑:程序博客网 时间:2024/06/07 18:44

转载自:http://blog.sina.com.cn/s/blog_64e467d60100uhls.html
http://sourceforge.net/projects/jython/下载jython包,把其中的jython.jar添加到工程目录

1.在Java类中直接执行Python语句
view plain
import javax.script.*;

import org.python.util.PythonInterpreter;

import java.io.*;
import static java.lang.System.*;
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
}

这样得到的结果是Tue,在控制台显示出来,这是直接进行调用的。
2.在java中调用本机python脚本中的函数:
首先建立一个python脚本,名字为:my_utils.py
view plain
def adder(a, b):
return a + b
然后建立一个java类,用来测试,
java类代码 FirstJavaScript:
view plain
import javax.script.*;

import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

import java.io.*;
import static java.lang.System.*;
public class FirstJavaScript
{
public static void main(String args[])
{

    PythonInterpreter interpreter = new PythonInterpreter();      interpreter.execfile("C:\\Python27\\programs\\my_utils.py");      PyFunction func = (PyFunction)interpreter.get("adder",PyFunction.class);      int a = 2010, b = 2 ;      PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));      System.out.println("anwser = " + pyobj.toString());  }//main  

}
得到的结果是:anwser = 2012
3.使用java直接执行python脚本,
建立脚本inputpy
view plain
open files

print ‘hello’
number=[3,5,2,0,6]
print number
number.sort()
print number
number.append(0)
print number
print number.count(0)
print number.index(5)

建立java类,调用这个脚本:
view plain
import javax.script.*;

import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

import java.io.*;
import static java.lang.System.*;
public class FirstJavaScript
{
public static void main(String args[])
{

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile(“C:\Python27\programs\input.py”);
}//main
}

得到的结果是:
view plain
hello
[3, 5, 2, 0, 6]
[0, 2, 3, 5, 6]
[0, 2, 3, 5, 6, 0]
2
3

由于Python功能强大并且各种应用程序库十分丰富,它常常可以以一种简单的方式来完成C/C++比较难实现的功能。Python/C API可以使得C/C++程序员在他们的程序中嵌入Python程序,使得开发的灵活性和简易性大大提高。在这里我以python 2.5版本举一个小例子来简单讲述一下Python/C API的用法,如果大家有兴趣可以参见官方文档来深入学习:

http://docs.python.org/c-api/

在code之前需要先做一些准备:

  1. 把python的include和libs目录分别加到vc的include和lib directories中去。
  2. 另外,由于python没有提供debug lib,具体地说,就是没有提供python25_d.lib了,所以默认只能在Release下运行。
  3. 可以自己编译python的源代码来得到python25_d.lib。
  4. 或者,想要在debug下运行程序的话,你要把pyconfig.h(在python25/include/目录下)的大概是在283行,
  5. 把pragma comment(lib,”python25_d.lib”)改成pragma comment(lib,”python25.lib”),让python都使用非debug lib.

我们需要嵌套的这段Python代码用于遍历目录得到其下的所有文件。将这个.py文件copy到工程目录中。

1: #-- coding:gbk --
2:
3: import os,sys
4:
5: def walk_dir(dirpath,dirfile):
6: if not os.path.exists(dirpath) :
7: print ‘%s does not exits, please try again !’ %dirpath
8: return -1
9:
10: dirtuple=[dirs for dirs in os.walk(dirpath)][0]
11: #print ‘dirtuple is’,dirtuple
12: root=dirtuple[0]
13: #print ‘root is’,root
14: if root[len(root)-1] != os.sep :
15: root+=os.sep
16:
17: f=file(dirfile,’a’)
18: for files in dirtuple[2]:
19: f.write(‘%s\n’ % (root+files))
20: f.flush() #avoid buffer overflow
21: f.close()
22:
23: for dirs in dirtuple[1]:
24: walk_dir(root+dirs,dirfile)
25:
26: return 1
27:

下面这段代码中的注释简要介绍了常用的Python/C API

1: #include
2: #include
3: #include

0 0