因为大作业要求使用java完成,我却作死的想用pycha,于是进行了一系列摸索。以下分享一下成果
- 使用java调用python有大概三种方法,这个网上都可以查到,但是对于有外部扩展包的python脚本,只有一种方法可以运行,另外两种都会报错说 no module named xxx。
Process process = Runtime.getRuntime().exec(arg);
arg是你需要传递的参数,鉴于arg是数组的形式,于是我将数据形式存储为一维数组,奇数项为下标,偶数为数值(虽然不太合理,但是暂时没有想到别的方法)
2.于是将test.java 写成如下:
String[] a = { "2005", "1000", "2006", "2000", "2007", "1500", "2008", "2340" };
String[] arg = new String[] { "C:\\Python27\\python.exe", "pycha-0.7.0\\examples\\test.py" };
int alength = a.length;
int arglength = arg.length;
arg = Arrays.copyOf(arg, alength + arglength);// 扩容
System.arraycopy(a, 0, arg, arglength, alength);// 将第二个数组与第一个数组合并
Process process = Runtime.getRuntime().exec(arg);
3.接下来需要写test.py来接收参数并且画出pycha的图表
import sys
import cairo
from pycha.pie import PieChart
print "script name:", sys.argv[0]
i=1;
list = []
while i<len(sys.argv):
print "Parameter:", i, sys.argv[i]
list.append((sys.argv[i], [[0, float(sys.argv[i + 1])]])) #奇数项为下标,偶数项为数值,添加进list中
i = i + 2
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 400, 400)
chart = PieChart(surface)
dataSet = tuple(list) #将list转化为tuple
chart.addDataset(dataSet) #设置数据
chart.render()
surface.write_to_png("testpie.png")#生成图表
4.test.py的脚本目录下会产生testpie.png,在java中就可以使用了。
建议单独放在一个文件夹中,在程序退出时,清空图片缓存。