源命令不通过Java工作



从最后一天开始,我一直在尝试使用java在终端(Mac)上执行命令,但是我什么都不做任何事情。

我有以下2个命令,我想执行并在Java中获取输出

source activate abc_env
python example.py

到现在,我尝试了以下方法,没有任何输出

String[] command = new String[] { "source activate abc_env", "python example.py"};
String result = executeCommands(command);

这是我的ExecuteCommands方法

private static String executeCommands(String[] command) {
        StringBuffer output = new StringBuffer();
        Process p;
        try {
            for(int i=0; i< command.length;i++)
            {
                p = Runtime.getRuntime().exec(command[i]);
                p.waitFor();
                BufferedReader reader = 
                                new BufferedReader(new InputStreamReader(p.getInputStream()));
                String line = "";           
                while ((line = reader.readLine())!= null) {
                    output.append(line + "n");
                }
                System.out.println("Error output: " + p.exitValue());
                System.out.println("Output:" + output);
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Here");
        }
        return output.toString();
    }

这给了我以下例外

无法运行程序"源":错误= 2,没有此类文件或目录

我在网上搜索,人们说消息来源不会这样起作用,我应该将命令更改为

String[] command = new String[] { "bash -c 'source activate abc_env'", "python example.py"};

现在,我会得到异常,但命令仍然不起作用,并且返回'2'as exitValue()

然后我尝试将命令作为脚本执行

#!/bin/bash
source activate abc_env
python example.py

当我将.sh文件读为字符串并将其传递给命令

时,我会得到以下异常

无法运行程序"#!/bin/bash":错误= 2,没有此类文件或目录

那么,我的问题是如何运行源命令,然后通过Java正确地运行Python命令?我的最终目标是从Java执行一些Python。

edit1:如果我尝试以下命令并打印输出流

String[] command = {
                "/bin/bash",
                "-c",
                "source activate cvxpy_env"
        };
executeCommand(command));

输出流:

出口:1

erroriotput:/bin/bash:激活:没有这样的文件或目录

如果我尝试了相同的命令,但是带有单个引号,围绕"源激活ABC_ENV"。我得到以下输出

出口:127

erroriotput:/bin/bash:源激活cvxpy_env:找不到命令

解决方案:

String[] command = {
                "/bin/bash",
                "-c",
                "source /Users/pc_name/my_python_library/bin/activate abc_env;python example.py"
        };

根据Javadoc,Runtime.exec(String)使用StringTokenizer将命令分解为命令 - ARGS列表,该命令可能会将您的命令分解为:

bash
-c
'source
activate
abc_env'

这显然不是您想要的。您应该做的可能是使用Runtime.exec(String[])的版本,该版本接受了准备的参数列表,传递给 new String[] {"bash", "-c", "source activate abc_env"}

现在,要了解为什么它不起作用,您不仅应该使用p.getErrorStream()stdout读取它,还应从stderr读取。只需打印出您阅读的内容,这将是一个很好的调试援助。

re:您的编辑。现在,就爪哇和bash而言,它看起来很好。输出"激活:无此类文件或目录"可能是source命令成功运行的输出。只是source找不到activate文件。是在工作目录中吗?如果没有,您可能应该有"cd /wherever/your/files/are; source activate cvxpy_env"。哦,如果您的Python脚本取决于源命令所具有的任何副作用,则您可能必须在同一bash实例中执行它,也就是说:

String[] command = {
                "/bin/bash",
                "-c",
                "cd /wherever/your/files/are && source activate cvxpy_env && python example.py"
        };

或更好的是,将它们全部包装到一个外壳脚本中,然后将其包装到Runtime.exec("./my_script.sh")(尽管不要忘记chmod +x)。

尝试

String[] command = {
                "/bin/bash",
                "-c",
                "source activate abc_env; " + "python example.py"
        };

相关内容

  • 没有找到相关文章