如何在python中调用java程序作为子进程时传递字典?

时间:2016-03-24 14:46:36

标签: java python dictionary

我正在尝试使用python调用java jar程序,当我将输入参数作为字符串传递时,它正常工作。现在我需要将字典作为输入参数传递。

以下是代码:

的Python:

class ExecuteKTR():
     def GET(self,r):
      web.header('Access-Control-Allow-Origin','*')
      web.header('Access-Control-Allow-Credentials', 'true')
      secToken = web.input().SecurityToken
      Domain = web.input().Domain
      fieldnames = ast.literal_eval(web.input().fieldnames)
      authResult = Auth.GetSession(secToken,Domain)
      if authResult.reason == "OK":
        args = ['ktrjob.jar', 'arg1', 'arg2', 'argN'] # Any number of args to be passed to the jar file
        result = jarWrapper(*args)
        print result
      elif authResult.reason == 'Unauthorized':
         result = comm.format_response(False,authResult.reason,"Check the custom message",exception=None)
         return result

def jarWrapper(*args):
    process = Popen(['java', '-jar']+list(args), stdout=PIPE, stderr=PIPE)
    ret = []
    while process.poll() is None:
        line = process.stdout.readline()
        print line
        if line != '' and line.endswith('\n'):
            ret.append(line[:-1])
    stdout, stderr = process.communicate()
    ret += stdout.split('\n')
    if stderr != '':
        ret += stderr.split('\n')
    ret.remove('')
    return ret

爪哇:

   String file = "";         
        if(args.length != 0)
        {
            file = args[0];
            for ( int i=0;i<=args.length;i++)
            {                   
                System.out.print(args[i]);
            }
        }

我需要将字典作为参数传递给java应用程序。样本一是,

{DateTime:12/03/2016,DealerName:'Test'}

3 个答案:

答案 0 :(得分:3)

Java只允许字符串数组作为程序的输入参数,因为Java中main方法的签名显示:

public class MainClass {

    public static void main(final String[] args)
    {
        //do stuff
    }
}

您需要将字典转换为一个(或多个)字符串以用于java程序的输入,并解码Java程序中的传输字符串。一种解决方案是将您的字典编写为JSON字符串,并从Java程序中提供的String中解析JSON对象。

要在python中创建JSON字符串,您可以使用

strJSON = json.dumps(myDict)

在Java中,有几个库可以从Json格式导入have a look here

答案 1 :(得分:1)

你可以使用JSON将字典作为字符串传递,因为在Python字典中和JSON基本相同

答案 2 :(得分:0)

将字典传递给程序是没有意义的:所有可以传递给子进程的都是字符串。

所以你必须选择一个约定。如果您需要能够传递任意对象,则JSON是一个选项,因为库存在于两种语言中。如果字典非常简单并且结构总是相同,那么您也可以只传递变量部分。但要注意,JSON没有指定任何日期格式,因此您必须选择自己的日期格式,并在Python和Java端保持一致。