关于java和thinkPHP调用python算法

本文介绍了如何在Windows环境下使用Java调用Python脚本,以及在Linux环境下使用PHP调用Python算法。Java代码需指定Python解释器路径,使用ProcessBuilder启动进程。在Linux中,由于权限问题,需要通过visudo为PHP运行用户分配权限。PHP调用时利用proc_open管理进程,并注意文件权限和编码问题。
摘要由CSDN通过智能技术生成

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的编码方式中文也会出现乱码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值