Window+java
先讲讲在Window环境下使用java调用python算法。
具体的代码如下
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
public class text {
public static void main(String[] args) {
try {
String pythonFIle = "C:\\Users\\Lenovo\\Desktop\\10,18-10.25lianxi\\test.py"; // 需要执行的 Python 代码路径
ProcessBuilder pb = new ProcessBuilder("D:\\anaconda3\\envs\\py36\\python.exe", pythonFIle); // 创建进程
pb.inheritIO();
pb.directory(new File("C:\\Users\\Lenovo\\Desktop\\10,18-10.25lianxi"));
Process process = pb.start(); // 启动进程
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); // 创建读取缓冲区
String line;
while ((line = reader.readLine()) != null) { // 读取 Python 代码输出的内容
System.out.println(line); // 打印输出结果
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Java代码在运行python文件之后,会产生三种流,标准输入流、标准输出流和标准错误流。
需要特别注意的是如果没有特定指定三种流的输出文件或进行处理。需要使用pb.inheritIO();
pb.inheritIO() 表示将子进程(即执行 Python 程序的进程)的标准输入流、标准输出流和标准错误流都直接连接到 Java 程序的标准输入、标准输出和标准错误。换言之,子进程输出的内容可以直接在控制台中显示,而不需要在 Java 代码中手动编写读取输出的逻辑。
Linux+php
Linux+php调用python算法有很多需要注意的点,特别是在服务器上。
php和java一样,有类似的调用方法,但是在linux环境下,访问php接口的用户并不是root,会提示权限不足。
参考CSDN:linux apache 执行权限,linux -- Apache执行权限_lloydsheng的博客-CSDN博客
在linux命令行输入lsof -i:80,查看Apache的执行用户(以下为www)
拿到www这个用户名称之后,在命令行输入:visudo
进入文件后需要在root下面新增一行,给www用户分配权限。
php代码如下:
public function getPython(){
$m = M();
$eq_number=I('eq_number'); //接收接口传入的参数
$xlsx='pile'.$eq_number.'.xlsx';
$descriptorspec = array(
0 => array("pipe", "r"), // 标准输入(子进程从此管道中读取数据)
1 => array("pipe", "w"), // 标准输出(子进程向此管道中写入数据)
2 => array("pipe", "w") // 标准错误(子进程向此管道中写入错误消息)
);
$command = 'sudo /root/anaconda3/envs/py36/bin/python /www/wwwroot/zhourijiang.top/myNews/qq_lstm/lstm_3.py ' . $xlsx .' '.$eq_number; // 以 root 权限执行 Python 命令 需要指定python的位置,运行python的位置,python文件的运行目录
$workingDir = '/www/wwwroot/zhourijiang.top/myNews/qq_lstm'; // 设置 Python 脚本所在的执行目录
$process = proc_open($command, $descriptorspec, $pipes,$workingDir);
if (is_resource($process)){
$result = stream_get_contents($pipes[1]); // 从 stdout 读取子进程的输出
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process); // 关闭进程
}else{
$result = array('status' => 'fail', 'message' => 'Failed to start Python process');
}
echo json_encode($result);
}
最后,python的代码中最好不要有中文,文件的命名也最好不要,在命令行运行不会报错,但是用接口调用会报错。Java中如果没有特定指定utf-8的编码方式中文也会出现乱码。