Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / PHP / Ejecutar scripts de Python en Laravel

Ejecutar scripts de Python en Laravel

Por jc mouse miércoles, mayo 21, 2025

Integrar Python en proyectos Laravel puede ser bastante útil para tareas específicas donde Python destaca y PHP se queda corta, por ejemplo:

  • Machine Learning (ML) y análisis de datos.
  • Automatización de tareas de scripting.
  • Integración con APIs de tercero.

Ahora bien, existen varias formas de integrar los scripts de Python en Laravel como

  • Ejecutar directamente los scripts de python usando exec() o shell_exec() de PHP o Process de Laravel.
  • Mediante APIs
  • Mediante colas de Laravel (Laravel Queues) para tareas asincrónicas o de larga duración
  • Ayudandonos de librerias de terceros.

Integrar Script Python en Laravel

Paso 1. Necesitamos un Script con una tarea trivial para no complicarnos las cosas, por ejemplo la resolución de una ecuación cuadratica.

Cuadratica.py

En la dirección storage/app/ creamos una carpeta llamada scripts/ y en ella creamos el archivo Cuadratica.py con el siguiente contenido:

import cmath # Importa el módulo cmath para manejar números complejos
import sys   # Importa sys para acceder a los argumentos de la línea de comandos
import json  # Importa json para retornar la salida en formato JSON

def resolver_ecuacion_cuadratica(a, b, c):
    """
    Resuelve una ecuación cuadrática de la forma ax^2 + bx + c = 0.

    Args:
        a (float): Coeficiente de x^2. No puede ser cero.
        b (float): Coeficiente de x.
        c (float): Término constante.

    Returns:
        dict: Un diccionario con las raíces de la ecuación y un mensaje.
    """

    if a == 0:
        return {"error": "El coeficiente 'a' no puede ser cero para una ecuación cuadrática."}

    discriminante = (b**2) - 4*(a*c)

    if discriminante > 0:
        x1 = (-b - discriminante**0.5) / (2*a)
        x2 = (-b + discriminante**0.5) / (2*a)
        return {
            "status": "success",
            "message": "Las raíces son reales y distintas.",
            "roots": [x1, x2]
        }
    elif discriminante == 0:
        x1 = -b / (2*a)
        return {
            "status": "success",
            "message": "La ecuación tiene una raíz real doble.",
            "roots": [x1]
        }
    else:
        x1 = (-b - cmath.sqrt(discriminante)) / (2 * a)
        x2 = (-b + cmath.sqrt(discriminante)) / (2 * a)        
        return {
            "status": "success",
            "message": "Las raíces son números complejos conjugados.",
            "roots": [str(x1), str(x2)] 
        }

if __name__ == "__main__":    
    if len(sys.argv) < 4:
        print(json.dumps({"error": "Faltan argumentos. Se esperan a, b, c."}))
        sys.exit(1) 

    try:
        a = float(sys.argv[1])
        b = float(sys.argv[2])
        c = float(sys.argv[3])
    except ValueError:
        print(json.dumps({"error": "Los argumentos deben ser números válidos."}))
        sys.exit(1)

    result = resolver_ecuacion_cuadratica(a, b, c)
    print(json.dumps(result))

Para el ejemplo se guardan los scripts en la carpeta Storage/, sin embargo eso depende de las necesidades de cada proyecto o del contenido de los scripts y su forma de interactuar con la aplicación Laravel.

Si se va utilizar un sistema operativo como Linux o MacOS, es necesario otorgar los permisos necesarios a los scripts de python.

chmod +x storage/app/scripts/Cuadratica.py

Paso 2. La clase Controller

Nuestra clase se llama CuadraticaController.php, en esta clase importamos la clase Process para ejeuctar los scripts y la clase ProcessFailedException para el control de excepciones.

<?php

namespace App\Http\Controllers;

use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

class CuadraticaController extends Controller
{

    /**
     * Resuelve la ecuación cuadrática usando un script de Python.
     *
     * @param  $a de tipo numerico
     * @param  $b de tipo numerico
     * @param  $c de tipo numerico
     * @return \Illuminate\Http\JsonResponse
     */
    public function solve($a, $b, $c)
    {
        if ($a == 0) {
            return response()->json([
                'error' => 'Variable invalida',
                'message' => 'variable "a" no puede ser cero',
            ], 500);
        }

        //Se define la ruta al script de Python        
        $pythonScriptPath = storage_path('app/scripts/cuadratica.py');

        // Obtiene la ruta al intérprete de Python        
        $pythonExecutable = 'LA_RUTA_A_PYTHON'; // O 'python', '/usr/bin/python3', etc.

        // Comando para ejecutar el script de Python        
        $command = [
            $pythonExecutable,
            $pythonScriptPath,
            (string) $a,
            (string) $b,
            (string) $c
        ];

        //  Crea una nueva instancia de Process
        $process = new Process($command);
        // Opcional: Establece un tiempo de espera para el proceso (en segundos)
        $process->setTimeout(60);

        try {
            //Ejecuta el proceso
            $process->run();

            if (!$process->isSuccessful()) {
                throw new ProcessFailedException($process);
            }

            // Obtiene la salida del script de Python
            $output = $process->getOutput();
            $result = json_decode($output, true);

            // Retorna la respuesta como JSON
            if (json_last_error() !== JSON_ERROR_NONE) {
                return response()->json([
                    'error' => 'La salida del script de Python no es JSON válido.',
                    'python_output' => $output
                ], 500);
            }

            if (isset($result['error'])) {
                return response()->json(['error' => $result['error']], 400);
            }

            return response()->json($result);
        } catch (ProcessFailedException $exception) {
            return response()->json([
                'error' => 'Error al ejecutar el script de Python.',
                'message' => $exception->getMessage(),
                'stderr' => $process->getErrorOutput() // Salida de errores del script
            ], 500);
        } catch (\Exception $e) {
            return response()->json([
                'error' => 'Ocurrió un error inesperado.',
                'message' => $e->getMessage()
            ], 500);
        }
    }
}

Paso 3. Ejecución del scripts.

No utilizaremos interface grafica, sino llamaremos al scripts directamente desde route.

<?php
use App\Http\Controllers\CuadraticaController;
Route::get('/cuadratica/{a}/{b}/{c}', [CuadraticaController::class, 'solve']);

Ejecutamos desde el navegador y tenemos:

Enjoy!!!

Tags

Artículos similares

Ejercicios Resueltos C Sharp

1. Dado N números enteros ingresados por teclado, determine el promedio de estos 01 static void Main(string[] args) 02 {[...]

Libreria swing BlackTabbedPane

Continuación del tutorial [Personalizar JTabbedPane con Netbeans]. La clase BlackTabbedPaneUI que extendemos de BasicTab[...]

Mapas con HTML5 – Funciones de pintado – Parte 5

En esta penúltima parte, declaramos las funciones que nos permitirán pintar los shapes en el canvas, vamos al grano que[...]

NBANDROID-V2 plugin para Netbeans

Cuando Android estaba en sus inicios, varios IDEs (Entorno de Desarrollo Integrado​​) se disputaban el dominio por su de[...]

¿Cómo usar la aplicación «Reporta tu evidencia»?

El Ministerio de Planificación del Desarrollo de Bolivia a través del Viceministerio de Ciencia y Tecnología, puso a dis[...]

Microservicio REST Java con Spark – Parte 2

Segunda y ultima parte del post dedicado a la creación de un microservicio en lenguaje java utilizando el framework Spar[...]