基本的Java Runtime程序找不到python

时间:2017-03-07 01:37:37

标签: java python cmd path runtime

你好,正在处理一个只需要运行python脚本的小程序。这个python脚本将播放一个给定的.wav文件,并在乌龟屏幕上绘制一个形状。因此,我不是在寻找要返回java的输出。这是我的java代码:

public class Driver {

public static void main(String[] args){
    try {
        Process p = Runtime.getRuntime().exec("python " + 
" D:/Coding Files/Python/MusicColors.py" +"  teenagers.wav");
    }
    catch (Exception e){
        System.out.println(e);
    }
}
}

我得到的例外是:

java.io.IOException: Cannot run program "python": 
CreateProcess error=2, The system cannot find the file specified

我可能犯了一个非常愚蠢的错误,因为我对流程等主题知之甚少。我将python添加到我的系统路径中,所以每当我将“python”放入命令行时,它都会返回

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information.

并使其成为python shell。

以下是我添加到环境路径的确切行: C:\ Users \用户乔\应用程序数据\本地\程序\的Python \ Python35-32

如果有人能弄清楚我哪里出错了,我真的很感激!

1 个答案:

答案 0 :(得分:0)

您设置的$ PATH变量不会在Java的执行上下文中继承。尝试将Python的bin路径传递给exec()的执行环境。

为此,下面的代码首先检索所有环境变量并创建一个ENV_KEY = ENV_VALUE对的数组。

然后,Python的bin的路径将附加到PATH值。

最后,我们将所有环境变量的数组传递给exec()(通过第二个参数)。

import java.util.HashMap;
import java.util.Map;

public class Driver {
    public static void main(String[] args){
        try {
            String[] commands = {"python D:/Coding Files/Python/MusicColors.py teenagers.wav"}; 

            // Get a list of all environment variables
            final Map<String, String> envMap = new HashMap<String, String>(System.getenv());

            // Append Python bin path to Path
            envMap.put("Path", envMap.get("Path") + ";C:/Users/Joe/AppData/Local/Programs/Python/Python35-32");

            // Convert to an array of ENV_KEY=ENV_VALUE format strings
            final String[] envs = new String[envMap.size()];
            int i = 0;
            for (Map.Entry<String, String> e : envMap.entrySet()) {
                envs[i] = e.getKey() + '=' + e.getValue();
                i++;
            }

            // Exec with the environment variables
            Process p = Runtime.getRuntime().exec(commands, envs); 
        }
        catch (Exception e){
            System.out.println(e);
        }
    }
}