源命令不能通过Java工作

源命令不能通过Java工作,java,python,bash,terminal,Java,Python,Bash,Terminal,从最后一天开始,我一直在尝试使用JAVA在终端(MAC)上执行一个命令,但无论我做什么都没有效果 我有以下两个命令要执行,并用JAVA返回输出 source activate abc_env python example.py 到目前为止,我已经尝试了以下方法,但没有任何结果 String[] command = new String[] { "source activate abc_env", "python example.py"}; String result = executeComm

从最后一天开始,我一直在尝试使用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();
    }
现在,我没有得到异常,但是命令仍然不起作用,它返回'2'作为exitValue()

然后我尝试以脚本的形式执行这些命令

#!/bin/bash
source activate abc_env
python example.py
当我以字符串形式读取.sh文件并将其传递给命令时,会出现以下异常

无法运行程序“#!/bin/bash”:错误=2,没有这样的文件或目录

所以,我的问题是如何通过Java正确地运行源代码命令和python命令?我的最终目标是从Java执行一些python

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

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

executeCommand(command));
输出流:

存在值:1

ErrorOutput:/bin/bash:activate:没有这样的文件或目录

如果我尝试相同的命令,但在“source activate abc_env”周围加上单引号。我得到以下输出

现存价值:127

ErrorOutput:/bin/bash:source activate cvxpy\u 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
将命令分解为命令参数列表,这可能会将命令分解为:

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

现在,为了了解它为什么不工作,您不仅应该阅读它的
stdout
,还应该使用
p.getErrorStream()
阅读
stderr
。只要把你读到的打印出来,这将是一个很好的调试帮助

回复:你的编辑。现在,就Java和bash而言,它看起来工作得很好。“激活:没有这样的文件或目录”输出可能是成功运行
source
命令的输出。只是
source
找不到
activate
文件。它在工作目录中吗?如果没有,您可能应该有
“cd/where/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"
        };

或者更好的办法是,将其全部打包到一个shell脚本中,然后只使用
Runtime.exec(“./my_script.sh”)
(不过不要忘记
chmod+x
它)。

我尝试了您提到的方法,但仍然有一个错误。我已经更新了我的问题。请看编辑1。好的,太好了。我将尝试你的新答案,并将很快更新你。去开会,太好了。我让它工作了。我只是包含了激活脚本的路径,它工作得很好。谢谢。见编辑1。我尝试了您提到的方法,但仍然有错误。@Behroz您可能需要指定“activate”和“abc_env”脚本以及“example.py”的完整路径。错误告诉您它找不到文件。/bin/bash更清楚地说,linux中的“/Users/pc\u name/my\u python\u library/bin/activate/”可以转换为Anaconda的安装路径,例如:“/opt/Anaconda/bin/activate”。因此:
source/opt/anaconda/bin/activate abc_env
(如果abc_env是您环境的名称)。
bash
-c
'source
activate
abc_env'
String[] command = {
                "/bin/bash",
                "-c",
                "cd /wherever/your/files/are && source activate cvxpy_env && python example.py"
        };