微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

源命令无法通过Java使用

从最后一天开始,我一直在尝试使用JAVA在终端(MAC)上执行命令,但是我什么也不做.

我有以下两个要执行的命令,并希望在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();
    }

这给了我以下异常

Cannot run program “source”: error=2, No such file or directory

我在网上搜索过,有人说该源无法像这样工作,我应该将命令更改为

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

现在,我没有得到异常,但是该命令仍然不起作用,它以exitValue()的形式返回“ 2”

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

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

当我读取.sh文件作为字符串并将其传递给命令时,出现以下异常

Cannot run program “#!/bin/bash”: error=2, No such file or directory

因此,我的问题是如何通过Java正确运行source命令,然后正确运行python命令?我的最终目标是从Java执行一些python.

编辑1:
如果我尝试以下命令并打印输出

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

executeCommand(command));

输出流:

ExitValue:1

ErrorOutput:/bin/bash: activate: No such file or directory

如果我尝试相同的命令,但在“源代码”周围用单引号引起来,请激活abc_env.我得到以下输出

ExitValue:127

ErrorOutput:/bin/bash: source activate cvxpy_env: command not found

解:

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

解决方法:

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

bash
-c
'source
activate
abc_env'

显然这不是您想要的.您应该做的可能是使用Runtime.exec(String [])的版本,该版本接受现成的参数列表,并将新的String [] {“ bash”,“ -c”,“ source activate abc_env”}传递给它.

现在,要弄清为什么它不起作用,您不仅应该使用p.getErrorStream()从其stdout中读取,而且还应该从stderr中读取.只需打印出您所阅读的内容,它将对调试产生很大的帮助.

回复:您的编辑.就Java和bash而言,现在看起来一切正常.输出“激活:没有这样的文件或目录”可能是成功运行source命令的输出.只是该源找不到激活文件.它在工作目录中吗?如果不是,您可能应该具有“ cd / wherever / your / files / are;源激活cvxpy_env”.哦,如果您的python脚本取决于source命令的副作用,那么您可能必须在同一bash实例中执行它,即:

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

或者更好的是,将所有内容打包到一个单独的shell脚本中,然后打包到Runtime.exec(“ ./ my_script.sh”)中(尽管不要忘记对其进行chmod x处理).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐