3

Buen dia tengo mi siguiente archivo python, quiero poder ejecutarlo desde un archivo php quisiera saber si esta correcto la manera en como lo estoy queriendo ejecutar desde mi archivo php.

El problema es que al ejecutar el archivo php no se esta ejecutando mi archivo python ya que la carpeta donde deberian estar copiados los archivos no tiene nada, pero si ejecuto directamente el archivo python reviso la carpeta y ahora si ya tiene los archivos.

Entonces quiero saber si hay algo malo en mi forma de ejecutar mi archivo python desde php.

Tengo ambos archivos en el mismo proyecto en mi carpeta htdocs

transfer_FTP.py

from ftplib import FTP

servidor = "server"
user = "USER"
passw = ""

try:
    conexion = FTP(servidor)
    conexion.login(user, passw)
    print ("[+] conexion establecida correctamente")
except Exception as e:
    print ("[-] No se pudo establecer la conexion al servidor" + str(e))


# Cambia al directorio donde se encuentran los archivos .csv
conexion.cwd('/ruta/carpeta/')

# Lista todos los archivos en el directorio actual
archivos = conexion.nlst()

# Filtra solo los archivos .csv
archivos_csv = [archivo for archivo in archivos if archivo.endswith('.csv')]

# Para cada archivo .csv, descárgalo y guárdalo en el directorio local
for archivo in archivos_csv:
    with open('//ruta/a/la/carpeta/' + archivo, 'wb') as f:
        conexion.retrbinary('RETR ' + archivo, f.write)

Y tengo el siguiente codigo php copy_file.php

<?php
    $command = escapeshellcmd('pruebas/test.py');
    $output = shell_exec($command);
    echo $output;
?>
14
  • Y cual es el problema?
    – gbianchi
    Commented el 29 abr. a las 17:08
  • Que al ejecutar mi archivo copy_file.php Mi script python no se ejecuta reviso la carpeta donde deverian estar copiados los archivos y no estan. Pero si ejecuto directamente el script python si se copian los archivos. Quiero saber si esta correcto mi php Commented el 29 abr. a las 17:14
  • Y alguien llama a ese php???
    – gbianchi
    Commented el 29 abr. a las 17:21
  • Se ejecuta directamente desde el navegador ya que la idea es que el archivo se refresque cada hora y el refresh se definira mediante codigo php Commented el 29 abr. a las 17:23
  • navegador = cliente.. el python esta en el cliente?
    – gbianchi
    Commented el 29 abr. a las 17:24

1 respuesta 1

3

Ok vamos por partes, primero que nada te diré que considero esto del script en Python personalmente innecesario porque PHP tiene las capacidades de hacer conexiones FTP y mover archivos masivamente tal cual un CLI.

El llamar a un aplicativo de terceros puede traer inestabilidad o algún error no controlado, interrumpa la correcta ejecución del sistema.

Como invocar un archivo Python para su ejecución:

  1. Evaluar desde que sistema estas y/o vas a ejecutar el script:
<?php
// Ruta al archivo Python
$pythonScript = 'python_test/transfer_FTP.py';

// Verificar el sistema operativo actual
$os = strtoupper(PHP_OS_FAMILY);

// Comando para ejecutar el script Python según el sistema operativo
if ($os === 'WINDOWS') {
    // Comando para Windows
    $command1 = 'powershell -Command "Get-Command python"';
    $command2 = "python $pythonScript";
} else {
    // Comando para Linux y macOS
    $command1 = "command -v python";
    $command2 = "python3 $pythonScript";
}

Nota: hasta este punto ya hemos determinado el Sistema Operativo y el comando que queremos ejecutar.

  1. Antes de ejecutar el comando, debemos validar que este es un comando existente en el sistema:
$output = shell_exec($command1);

// Verificar si la salida contiene la información de la versión de Python
if (strpos($output, 'Python') !== false) {
    echo "Python está instalado en tu sistema.";
    //Metodo que ejecuta tu archivo py
    runPY($command2);
} else {
    echo "Python no está instalado en tu sistema.";
    //Mensaje de Error controlado para el output.
}

Output en Windows test terminal:

introducir la descripción de la imagen aquí

  1. entonces se viene el método para ejecutar el comando...
function runPY(string $command)
{
    $output = shell_exec($command);
    var_export($output); // unsa salidita de datos para ver que fue lo que paso en la ejecucion.
}

Ref php-os-family: https://www.php.net/manual/en/reserved.constants.php#constant.php-os-family

Ref polyfill antes de php7.2: https://github.com/symfony/polyfill/blob/1.x/src/Php72/Php72.php#L70

Ref shell-exec: https://www.php.net/manual/en/function.shell-exec

Nota: As-is esta implementación no pude probarla porque no tengo PHP instalado.

PHP y su forma nativa de mover archivos:

Como te decía, PHP tiene su forma nativa de hacer lo que intentas con el script Python:

<?php
// Configuración de conexión FTP
$ftp_server = "ftp.example.com"; // Cambia esto al nombre de tu servidor FTP
$ftp_username = "tu_usuario"; // Cambia esto a tu nombre de usuario FTP
$ftp_password = "tu_contraseña"; // Cambia esto a tu contraseña FTP

// Directorio remoto y local
$remote_dir = "/directorio_remoto"; // Cambia esto al directorio remoto que deseas descargar
$local_dir = "/directorio_local"; // Cambia esto al directorio local donde deseas guardar los archivos descargados

// Establecer conexión FTP
$conn_id = ftp_connect($ftp_server);
if (!$conn_id) {
    die("No se pudo conectar al servidor FTP");
}

// Iniciar sesión FTP
$login_result = ftp_login($conn_id, $ftp_username, $ftp_password);
if (!$login_result) {
    die("Error al iniciar sesión en el servidor FTP");
}

// Cambiar al directorio remoto
if (!ftp_chdir($conn_id, $remote_dir)) {
    die("No se pudo cambiar al directorio remoto: $remote_dir");
}

// Obtener lista de archivos en el directorio remoto
$files = ftp_nlist($conn_id, ".");

// Descargar archivos uno por uno
foreach ($files as $file) {
    // Nombre de archivo local
    $local_file = $local_dir . "/" . basename($file);

    // Descargar el archivo
    if (ftp_get($conn_id, $local_file, $file, FTP_BINARY)) {
        echo "Archivo descargado correctamente: $file<br>";
    } else {
        echo "Error al descargar el archivo: $file<br>";
    }
}

// Cerrar conexión FTP
ftp_close($conn_id);

IMPORTANTE: para que tanto el invocado del archivo PY o el método nativo FTP funcione, apache, nginx, iis o cualquiera que sea el servicio web que ejecutara el archivo .php, tanto el servicio como el usuario owner del servicio deberán tener permisos y privilegios de ejecución y escritura para poder poner los archivos en el directorio local, de lo contrario es posible que salte un error de permisos o no ocurra nada ...

3
  • Muchas gracias me ayudo mucho tu respuesta Tenias razon en cuanto el metodo ejecutarlo directamente en php, sinceramente no lo considere Commented el 29 abr. a las 21:29
  • php puede hacer muchas cosas ... es como un toolbox Commented el 29 abr. a las 21:32
  • Si la verdad me bloquie y me cerre en python Commented el 29 abr. a las 21:36

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.