I am calling java.lang.Runtime.exec(...) but this seems to accept the command lines as an array and I want to use a single string.
How can I do the same using a single string?
I am calling java.lang.Runtime.exec(...) but this seems to accept the command lines as an array and I want to use a single string.
How can I do the same using a single string?
From the linked Javadocs:
envp
- array of strings, each element of which has environment variable settings in the format name=value, ornull
if the subprocess should inherit the environment of the current process.
So just pass in null
for the second parameter, and the environment will be inhereted.
If you pass null
for the second paramter the current environment will be inherited.
If you want to modify the current environment, you can build it from System.getEnv()
like this:
private static String[] getEnv() {
Map<String, String> env = System.getenv();
String[] envp = new String[env.size()];
int i = 0;
for (Map.Entry<String, String> e : env.entrySet()) {
envp[i++] = e.getKey() + "=" + e.getValue();
}
return envp;
}
Update
You can check your Java path with System.out.println(System.getenv("PATH"));
If path is ok, then try it with
String[] commands = new String[] { "bash", "-c", "python foo/bar.py" };
Runtime.getRuntime().exec(commands, null, new File("/workingDir"));
From the documentation:
envp
- array of strings, each element of which has environment variable settings in the format name=value, ornull
if the subprocess should inherit the environment of the current process.
It sounds like you want to pass null
for that argument.
Currently there is no way of calling a system command with a command line as a single string and be able to specify the current directory.
It seems that Java API is missing this basic feature :)
The workaround is to use the array version instead of string.