You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9项目中调用Python脚本并传递信息的最优方法

在Laravel 9中调用Python脚本并传递信息的可行方案

下面是几种适合你场景的实现方式,都是生产环境中常用的方案:


方案一:通过Artisan命令封装调用(推荐,规范可控)

把Python脚本的调用逻辑封装到Laravel的Artisan命令中,便于日志记录、权限控制和后台执行。

步骤:

  1. 生成Artisan命令
    执行终端命令创建自定义命令:

    php artisan make:command ProcessCsvToJson
    
  2. 编写命令逻辑
    在app/Console/Commands/ProcessCsvToJson.php中实现调用逻辑:

    <?php
    
    namespace App\Console\Commands;
    
    use Illuminate\Console\Command;
    
    class ProcessCsvToJson extends Command
    {
        protected $signature = 'csv:process {userData}';
        protected $description = 'Process CSV data using Python script with user input';
    
        public function handle()
        {
            // 获取前端传来的用户数据(已通过控制器传入)
            $userData = $this->argument('userData');
            // 转义数据防止命令注入
            $escapedData = escapeshellarg(json_encode($userData));
            // 调用Python脚本(假设脚本存放在项目根目录的scripts文件夹)
            $pythonPath = base_path('scripts/process_csv.py');
            $output = shell_exec("python3 {$pythonPath} {$escapedData}");
    
            // 处理输出:将生成的JSON写入存储目录
            file_put_contents(storage_path('app/public/processed_result.json'), $output);
            
            return 0;
        }
    }
    
  3. 前端+控制器触发命令
    前端通过AJAX把localStorage中的数据传给Laravel控制器,控制器调用命令:

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Artisan;
    
    class DataProcessController extends Controller
    {
        public function process(Request $request)
        {
            $localStorageData = $request->input('local_data');
            // 调用Artisan命令并传递参数
            Artisan::call('csv:process', ['userData' => $localStorageData]);
            // 返回JSON文件的访问路径给前端
            return response()->json([
                'json_path' => '/storage/processed_result.json'
            ]);
        }
    }
    
  4. Python脚本接收参数
    在Python脚本中读取命令行参数并处理:

    import sys
    import json
    import csv
    
    def main():
        # 接收Laravel传来的JSON数据
        user_data = json.loads(sys.argv[1])
        # 读取CSV数据库
        with open('/path/to/your/csv_database.csv', 'r', encoding='utf-8') as f:
            csv_data = list(csv.DictReader(f))
        # 根据用户数据修改CSV内容(你的业务逻辑)
        for item in csv_data:
            if item['id'] == user_data['target_id']:
                item['status'] = user_data['new_status']
        # 输出JSON结果(Laravel会捕获这个输出)
        print(json.dumps(csv_data, ensure_ascii=False))
    
    if __name__ == '__main__':
        main()
    

方案二:控制器直接调用Python脚本(简单场景快速实现)

如果不需要命令行的额外特性,可以直接在控制器中通过PHP的执行函数调用Python脚本:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class DataProcessController extends Controller
{
    public function process(Request $request)
    {
        $localStorageData = $request->input('local_data');
        $escapedData = escapeshellarg(json_encode($localStorageData));
        $pythonPath = base_path('scripts/process_csv.py');
        
        // 直接调用脚本并获取输出
        $processedJson = shell_exec("python3 {$pythonPath} {$escapedData}");
        
        // 直接返回处理后的JSON给前端,或写入文件
        return response()->json(json_decode($processedJson, true));
    }
}

方案三:将Python脚本做成独立API(适合复杂Python逻辑)

如果Python脚本的处理逻辑很复杂,或需要独立扩展,可以用FastAPI/Flask把它做成HTTP服务,Laravel通过HTTP请求调用:

1. 编写Python API(FastAPI示例)

from fastapi import FastAPI
from pydantic import BaseModel
import json
import csv

app = FastAPI()

# 定义接收数据的模型
class UserData(BaseModel):
    target_id: str
    new_status: str

@app.post("/process-csv")
async def process_csv(user_data: UserData):
    # 读取CSV数据库
    with open('/path/to/your/csv_database.csv', 'r', encoding='utf-8') as f:
        csv_data = list(csv.DictReader(f))
    # 修改数据
    for item in csv_data:
        if item['id'] == user_data.target_id:
            item['status'] = user_data.new_status
    # 返回JSON结果
    return csv_data

2. Laravel中调用API

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;

class DataProcessController extends Controller
{
    public function process(Request $request)
    {
        $localStorageData = $request->input('local_data');
        // 调用Python API
        $response = Http::post('http://localhost:8000/process-csv', $localStorageData);
        
        if ($response->successful()) {
            $processedData = $response->json();
            file_put_contents(storage_path('app/public/processed_result.json'), json_encode($processedData));
            return response()->json(['json_path' => '/storage/processed_result.json']);
        }
        
        return response()->json(['error' => 'Python API调用失败'], 500);
    }
}

关键注意事项

  • 安全防护:必须用escapeshellarg()处理传递给Python的参数,防止命令注入攻击。
  • 权限配置:确保Laravel的运行用户(如www-data)有执行Python脚本、读写CSV/JSON文件的权限。
  • 大数据处理:如果数据量较大,不要用命令行参数传递,改用临时文件传递数据(Laravel写入临时JSON,Python读取)。
  • 错误处理:调用Python脚本时,建议用exec()替代shell_exec(),通过第二个参数捕获执行返回码,判断脚本是否成功运行。

内容的提问来源于stack exchange,提问作者andreasv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 23:27:03