【问题标题】:Executing Python script from Java - Issues with parameter passing从 Java 执行 Python 脚本 - 参数传递问题
【发布时间】:2016-09-28 02:31:42
【问题描述】:

我正在尝试从 Java 执行 python 脚本。当我手动执行python脚本时,它可以正常工作。当我从 Java 执行它时,它的参数有问题:实际上,python 以“Usage”错误响应,就好像我没有传递参数一样。

Java 代码:

            String pythonCommand="python /path/to/myscript.py --key='value list here' -otherparam=param";
            p = Runtime.getRuntime().exec(pythonCommand);

            String line;
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            p.waitFor();
            logger.debug("Exit value: "+p.exitValue());
            while ((line = input.readLine()) != null) {
                logger.debug("Python command output: " +line);
            }
            while ((line = error.readLine()) != null) {
                logger.debug("Python command ERROR output: " +line);
            }
            input.close();

我再说一遍,如果我只是复制粘贴并按字面意思执行“pythonCommand”字符串中的内容,则脚本可以正常工作,但如果我从 Java 执行它,它会说:

2016-05-30 09:46:32 [threadName] DEBUG - Executing command: python /path/to/myscript.py --key='value list here' -otherparam=param
2016-05-30 09:46:32 [threadName] DEBUG - Exit value: 1
2016-05-30 09:46:32 [threadName] DEBUG - Python command ERROR output: Usage:
2016-05-30 09:46:32 [threadName] DEBUG - Python command ERROR output:   myscript.py [--key=<value list here>] --otherparam=<param>
2016-05-30 09:46:32 [threadName] DEBUG - Python command ERROR output:   myscript.py (-h | --help)
2016-05-30 09:46:32 [threadName] DEBUG - Python command ERROR output:   myscript.py --version

这里有什么问题?

编辑:另一个重要信息!如果我执行不带参数的 Python 脚本,例如“python /path/to/test.py”,它将完美运行。

edit2:我尝试执行一个不包含带有 ' 或 " 的多字参数的 Python 脚本,它起作用了。所以多字参数肯定是问题。我应该如何传递它们?

【问题讨论】:

    标签: java python parameters parameter-passing


    【解决方案1】:

    据我所知,您必须像这样将命令行拆分为 String[]:

    Runtime.getRuntime().exec(new String[]{"python","/path/to/myscript.py", "--key", "value list here", "-otherparam", "param"});
    

    【讨论】:

    • 抱歉,这不起作用。我不得不使用 pythonCommand.split(" ") 因为我没有构建命令,但它已传递给我的函数。字符串 [] 命令 = pythonCommand.split(" "); logger.debug("正在执行的命令:"+commands); p = Runtime.getRuntime().exec(commands);
    • 另外,从我的进一步测试来看,多字参数(其中包含空格)似乎是问题所在。
    • 如果您的值列表包含如示例中所示的空格(“此处的值列表”),则简单的 split() 将弄乱您的命令。你的 logger.debug("Executing command: "+commands); 的输出是什么?
    • 我必须使用 Arrays.toString(commands) 否则它会打印出 Java 数组的无用 toString 表示(类似于 String@somenumbers)。输出类似于: Executing command: [python, /path/to/myscript.py, --key='some, value, here', --key2=test] 所以你完全正确,命令是混乱的向上。我该如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2016-10-26
    • 2018-03-03
    • 2017-01-22
    • 2016-03-20
    相关资源
    最近更新 更多