Dépendances python des plugins: venv, pyenv & debian 12

des crons qui appellent un script python du coup? sinon je ne comprend pas trop l’interêt sur tout ça :slight_smile:
et si c’est juste l’appel à un script via cron, asyncio ne va rien apporter mais je n’ai p-e pas bien compris


pour revenir à la question sur les modifs à avoir dans le plugin, entre autre sur dependancy_info() et dependancy_install(), en fait c’est déjà documenté ici:

https://doc.jeedom.com/fr_FR/dev/daemon_plugin#La%20méthode%20par%20procédures

  • mettre à jour plugin_info/info.json
  • dependancy_install() peut-être repris tel quel de la documentation, bien sur ne pas suivre l’explication pour install_apt.sh puisque c’est l’objet de ce post
  • dependancy_info() tu peux t’inspirer de ce qu’il y a dans la doc, c’est ce que je faisais avant mais c’est fastidieux car il faut adapter la liste des dépendances pour chaque plugin;

Désormais ma fonction dependancy_info() est celle-ci (quasi toujours):

    public static function dependancy_info() {
        $return = array();
        $return['log'] = log::getPathToLog(__CLASS__ . '_update');
        $return['progress_file'] = jeedom::getTmpFolder(__CLASS__) . '/dependance';
        $return['state'] = 'ok';
        if (file_exists(jeedom::getTmpFolder(__CLASS__) . '/dependance')) {
            $return['state'] = 'in_progress';
        } elseif (!file_exists(self::PYTHON_PATH)) {
            $return['state'] = 'nok';
        } elseif (!self::pythonRequirementsInstalled(self::PYTHON_PATH, __DIR__ . '/../../resources/requirements.txt')) {
            $return['state'] = 'nok';
        }
        return $return;
    }

dans la class je déclare PYTHON_PATH pour utiliser mon venv (c’est juste pour ne pas devoir modifier à 4 endroits le path au cas où)

const PYTHON_PATH = __DIR__ . '/../../resources/venv/bin/python3';

et ma fonction pythonRequirementsInstalled() est celle-ci:

	private static function pythonRequirementsInstalled(string $pythonPath, string $requirementsPath) {
		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+\.?]+)$/', $line, $need) === 1) {
				if (preg_match('/' . $need[1] . '==([\d+\.?]+)/i', $packages, $install) === 1) {
					if ($need[2] == '==' && $need[3] != $install[1]) {
						return false;
					} elseif (version_compare($need[3], $install[1], '>')) {
						return false;
					}
				} else {
					return false;
				}
			}
		}
		return true;
	}

elle permet de vérifier que les dépendances d’un fichier requirements.txt sont bien installées dans le venv (avec la version voulue);
attention je ne gère pas toutes les syntaxes possibles mais juste >=, ~= et ==

cette fonction est aussi dispo dans GitHub - Mips2648/jeedom-tools: Tools and helper class for plugin development (parce que je déteste faire du copier/coller)

last but not least, très important, ajouter cette fonction dans la class eqLogic pour exclure le dossier venv du backup, sinon ca augmente beaucoup la taille du backup jeedom:

	public static function backupExclude() {
		return [
			'resources/venv'
		];
	}
1 « J'aime »