Installer dépendances python par version

requirements.txt; skyfield >= 1.53.0

0000|======================================================================
0001|== 19/09/2025 19:57:36 == Dependencies installation for MyPlugin
0002|======================================================================
0003|[  5% ] : Clean apt...
0004|[  9% ] : Clean apt : [  OK  ]
0005|[ 10% ] : Update apt...
0006|[ 19% ] : Update apt : [  OK  ]
0007|[ 20% ] : Init python3 & prerequisites...
0008|[ 29% ] : Init python3 & prerequisites : [  OK  ]
0009|[ 30% ] : Init PyEnv...
0010|** PyEnv not required: 3.11.2 >= 3.11 **
0011|** python3 path: python3 **
0012|[ 39% ] : Init PyEnv : [  OK  ]
0013|[ 40% ] : Setting up virtual environment...
0014|** Version of python in VENV: Python 3.11.2
0015|[ 69% ] : Setting up virtual environment : [  OK  ]
0016|[ 70% ] : Install the required python packages...
0017|[ 79% ] : Install the required python packages : [  OK  ]
0018|[ 80% ] : Restoring folders and files rights...
0019|[ 89% ] : Restoring folders and files rights : [  OK  ]
0020|[ 90% ] : Summary of installed packages...
0021|certifi==2025.8.3
0022|jplephem==2.23
0023|numpy==2.3.3
0024|sgp4==2.25
0025|skyfield==1.53
0026|[ 99% ] : Summary of installed packages : [  OK  ]
0027|[100% ] : Finished !
0028|======================================================================
0029|==OK== Installation Successful
0030|======================================================================

requirements.txt; skyfield >= 1.53

0000|======================================================================
0001|== 19/09/2025 19:59:23 == Dependencies installation for MyPlugin
0002|======================================================================
0003|[  5% ] : Clean apt...
0004|[  9% ] : Clean apt : [  OK  ]
0005|[ 10% ] : Update apt...
0006|[ 19% ] : Update apt : [  OK  ]
0007|[ 20% ] : Init python3 & prerequisites...
0008|[ 29% ] : Init python3 & prerequisites : [  OK  ]
0009|[ 30% ] : Init PyEnv...
0010|** PyEnv not required: 3.11.2 >= 3.11 **
0011|** python3 path: python3 **
0012|[ 39% ] : Init PyEnv : [  OK  ]
0013|[ 40% ] : Setting up virtual environment...
0014|** Version of python in VENV: Python 3.11.2
0015|[ 69% ] : Setting up virtual environment : [  OK  ]
0016|[ 70% ] : Install the required python packages...
0017|[ 79% ] : Install the required python packages : [  OK  ]
0018|[ 80% ] : Restoring folders and files rights...
0019|[ 89% ] : Restoring folders and files rights : [  OK  ]
0020|[ 90% ] : Summary of installed packages...
0021|certifi==2025.8.3
0022|jplephem==2.23
0023|numpy==2.3.3
0024|sgp4==2.25
0025|skyfield==1.53
0026|[ 99% ] : Summary of installed packages : [  OK  ]
0027|[100% ] : Finished !
0028|======================================================================
0029|==OK== Installation Successful
0030|======================================================================

N’aurais tu pas mis 2 fois les mêmes logs?

Pas la même heure de début

Après reflexion, je pense que c’est un petit soucis d’interprétation des valeurs de comparaison dans la fonction pythonRequirementsInstalled().

Je regarderais avec un peu plus d’attention demain.

Bah la version dans pip3 semble être 1.53 tout simplement, pas 1.53.0.

Edit : en creusant un tout petit peu il ne semble pas y avoir de versions intermédiaires en fait

1 « J'aime »

Merci Aurelien pour tes retours,

Il est vrai que j’attache une certaine importance à la robustesse au niveau de mes plugins mais aussi d’une façon générale à tout développement logiciel (déformation professionnelle :wink:).

Le comportement observé avec l’écriture des 2 versions de la lib skyfield 1.53 et 1.53.0 qui me semblaient être identiques m’a donc interpellé puisque sur l’installation des dépendances cela donne, (comme vous pouvez le voir plus haut) des résultats différents.

Qu’il n’y ait pas de valeurs intermédiare avec cette lib en particulier n’est pas ici la question.

Ainsi, à cette occasion, j’ai découvert que la fonction PHP version_compare() utilisée dans la méthode d’installation des dépendances pythonRequirementsInstalled() renvoie le resulat suivant:

version_compare('1.53.0', '1.53', '>') --> true

ce qui provoque un return False de la methode.

Chacun en tirera les conclusions qu’il souhaite.

Après avoir fait un peu travaillé l’IA, de mon coté je vais upgrader la methode pythonRequirementsInstalled() avec la version que je vous livre ci-dessous si cela vous interesse:

Encore merci à tous pour vos contributions.

private static function pythonRequirementsInstalled(string $pythonPath, string $requirementsPath)
{
    // Helper function for safe version comparison
    $safe_version_compare = function (string $a, string $b, string $operator): bool {
        $splitVersion = function ($v) {
            if (preg_match('/^([0-9.]+)(.*)$/', $v, $matches)) {
                return [$matches[1], $matches[2]]; // [numeric, suffix]
            }
            return [$v, ''];
        };

        [$aNum, $aSuffix] = $splitVersion($a);
        [$bNum, $bSuffix] = $splitVersion($b);

        $len = max(substr_count($aNum, '.') + 1, substr_count($bNum, '.') + 1);

        $normalize = function ($num, $length) {
            $parts = explode('.', $num);
            while (count($parts) < $length) {
                $parts[] = '0';
            }
            return implode('.', $parts);
        };

        $aNorm = $normalize($aNum, $len) . $aSuffix;
        $bNorm = $normalize($bNum, $len) . $bSuffix;

        return version_compare($aNorm, $bNorm, $operator);
    };

    if (!file_exists($pythonPath) || !file_exists($requirementsPath)) {
        return false;
    }

    exec("{$pythonPath} -m pip freeze", $packages_installed);
    $packages = join("||", $packages_installed);
    exec("cat {$requirementsPath}", $packages_needed);

    foreach ($packages_needed as $line) {
        if (preg_match('/([^\s]+)[\s]*([>=~]=)[\s]*([\d+\.?a-zA-Z-]+)/', $line, $need) === 1) {
            if (preg_match('/' . $need[1] . '==([\d+\.?a-zA-Z-]+)/', $packages, $install) === 1) {
                // Exact version required
                if ($need[2] == '==' && $need[3] != $install[1]) {
                    return false;
                }
                // Version must be greater or equal
                elseif ($safe_version_compare($need[3], $install[1], '>')) {
                    return false;
                }
            } else {
                return false; // package not installed at all
            }
        }
    }

    return true;
}