java调用Python 传递参数

20 篇文章 1 订阅

说明

java调用Python2,并向Python2传参数(注意,python3不用看本文 !)
因为需要动态传参数,可能有中文乱码,也可能有些参数是空值
所以思考良久后,决定编码两次,和解码两次,来解决这个问题。在java用base64对参数转码,这里转码了两次,Python也解码了两次。

java端编码两次

package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.codec.binary.Base64;
import net.sf.json.JSONObject;

public class Demo {
	public static void main(String[] args) throws Exception {
		String[] cmdarray = null;
		String[] envp = null;
		Map<String,String> map =new HashMap<String, String>();
		map.put("name", "名字");
		map.put("number", "123456");
		JSONObject json =new JSONObject();
		json.put("name", 
		Base64.encodeBase64String(map.get("name").getBytes("utf-8")));
		json.put("number", 
		Base64.encodeBase64String(map.get("number").getBytes("utf-8")));
		String jsonStr = json.toString();
		jsonStr = Base64.encodeBase64String(jsonStr.getBytes("utf-8"));
		if(isWindows()) {
			cmdarray = new String[] { "cmd", "/c", "python D:\\python2\\test.py",jsonStr};
			envp = new String[] {"path=D:\\Anaconda\\envs\\leantwo"};
		}else {
			cmdarray = new String[] { "/bin/sh","-c", "python D:\\python2\\test.py"};
			envp = new String[] {"export PATH=$PATH:/usr/local/bin/python"};
		}
		try {
			Process process = Runtime.getRuntime().exec(cmdarray, envp);
			BufferedReader in = new BufferedReader(
			new InputStreamReader(process.getInputStream()));
			String line = null;
			StringBuffer buffer = new StringBuffer();
			while ((line = in.readLine()) != null) {
				System.out.println(line);
				buffer.append(line);
			}
			in.close();
			int re = process.waitFor();
			System.out.println(re);
			System.out.println(buffer.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static boolean isWindows() {
		return System.getProperties().getProperty("os.name")
		.toUpperCase().indexOf("WINDOWS") != -1;
	}

python端解码两次

    #for i in range(1, len(sys.argv)):
    #   print "参数", i, sys.argv[i]  
    jsonObject = json.loads(base64.b64decode(sys.argv[1]))
    name = base64.b64decode(jsonObject['name'])
    number = base64.b64decode(jsonObject['number'])

参考资料

参考资料1

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值