在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编程