在Java中执行Python等本地程序(命令)

HearyHTTPd的开发过程中,我想要调用本地CGI,因此就需要在Java中调用本地的其他程序,或者说:执行本地的命令。本文以Java中调用Python脚本作为CGI程序为例,记录Java调用本地程序、执行本地命令的方法。

在Java中执行Python等本地程序(命令)

1 概述

HearyHTTPd的开发过程中,我想要调用本地CGI,因此就需要在Java中调用本地的其他程序,或者说:执行本地的命令。

我查了查发现Java中可以很简便地以执行命令的形式执行本地程序。

主要的执行代码在于调用Runtime,执行本地命令:

1
Process process = Runtime.getRuntime().exec(command, envs, file);

查阅java.lang.Runtime,核心方法exec原型为:

1
public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException
  • getRuntime: Returns the runtime object associated with the current Java application.
  • exec: Executes the specified command and arguments in a separate process with the specified environment and working directory.

实际上,这个函数额可以以执行命令的形式调用、执行任何本地程序,并通过标准输入、标准输出来传递数据。

2 代码

2.1 Java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package temp;

import java.io.*;

public class JCallPy {
public static void main(String[] args) throws IOException, InterruptedException {
String[] command = {
"C:\\Users\\heary\\miniconda3\\envs\\python3\\python.exe",
"called.py"
};
String[] envs = {
"QUERY_STRING=name=tom&age=18",
"REQUEST_METHOD=POST",
"REMOTE_ADDR=127.0.0.1"
};
File file = new File("./src/temp");
Process process = Runtime.getRuntime().exec(command, envs, file);
InputStream inputStream = process.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = bufferedReader.readLine();
while (line != null) {
System.out.println(line);
line = bufferedReader.readLine();
}
bufferedReader.close();
process.waitFor();
}
}

  • 此处只演示了执行本地Python脚本,通过环境变量传入CGI协议的参数,获取Python脚本运行过程中标准输出的内容,并显示出来。如果将输出结果进行处理,传输socket输出流或输出通道,就可以实现CGI的功能。

2.2 Python实现

1
2
3
4
5
6
7
8
9
10
11
import os

print("HTTP/1.0 200 OK")
print("Content-type: text/html")
print()
print("<b>Environment Variables</b>")

print("<ul>")
for key, value in os.environ.items():
print(f"<li>{key} = {value}</li>")
print("</ul>")

2.3 运行结果

1
2
3
4
5
6
7
8
9
10
HTTP/1.0 200 OK
Content-type: text/html

<b>Environment Variables</b>
<ul>
<li>QUERY_STRING = name=tom&age=18</li>
<li>REMOTE_ADDR = 127.0.0.1</li>
<li>REQUEST_METHOD = POST</li>
<li>SYSTEMROOT = C:\Windows</li>
</ul>

3 参考资料

JAVA调用Python代码

Python CGI编程