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

Laravel 10 API读取Python脚本name变量失败:preg_match匹配问题

问题原因与修复方案

核心问题分析

你的Python脚本读取逻辑存在两个关键错误:

  1. 匹配对象错误:你通过exec执行Python脚本后,获取的是print(name)的输出(即Python test),但正则表达式却在匹配name = "xxx"这种变量定义行,两者完全不匹配,导致无法捕获到值。
  2. 提前终止方法:代码中的return('I work');会直接终止整个控制器方法,不仅无法将匹配到的name加入数组,还会跳过后续所有插件的处理。

修复后的代码

直接参考PHP/JS的处理逻辑,读取Python文件内容后用正则匹配变量定义,同时移除错误的return语句:

<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\File;

class PluginAPIController extends Controller
{
    public function list()
    {
        $plugins = File::files(public_path('testplugins'));

        $names = [];

        foreach ($plugins as $file) {
            $extension = pathinfo($file, PATHINFO_EXTENSION);
            $contents = File::get($file);
            $matches = [];

            if($extension == "php"){
                preg_match('/\$name\s*=\s*\'(.*)\';/i', $contents, $matches);
                if (isset($matches[1])) {
                    $names[] = $matches[1];
                }
            }elseif ($extension == "js") {
                preg_match('/var\s+name\s*=\s*[\'"]([^\'"]+)[\'"];/i', $contents, $matches);
                if (isset($matches[1])) {
                    $names[] = $matches[1];
                }
            }elseif ($extension == 'py') {
                // 直接读取文件内容,匹配Python的name变量定义
                preg_match('/name\s*=\s*[\'"](.*?)[\'"]/i', $contents, $matches);
                if (isset($matches[1])) {
                    $names[] = $matches[1];
                }
            }
        }

        return $names;
    }
}

说明

  • 改用直接读取文件内容的方式,避免了执行外部Python命令的安全风险和环境依赖问题,逻辑和PHP/JS保持一致,更易维护。
  • 正则表达式/name\s*=\s*[\'"](.*?)[\'"]/i可以匹配Python中name = "xxx"或name='xxx'的变量定义,忽略大小写和等号前后的空格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:47:40