[PYTHON] Installation de bibliothèques dépendantes pour le calcul de la fonction cloud Alibaba

Cet article décrit comment utiliser les outils existants pour installer des bibliothèques dépendantes dans un projet ** Function Compute ** avec une intervention manuelle minimale.

Répertoire d'installation du gestionnaire de packages

Actuellement, Function Compute (https://www.alibabacloud.com/en/products/function-compute) prend en charge les environnements Java, Python et Node.js. Les gestionnaires de packages pour ces trois langues sont respectivement Maven, pip et NPM. Ce qui suit décrit les répertoires d'installation de chacun de ces gestionnaires de packages.

Maven Maven est un gestionnaire de packages Java. Maven télécharge les dépendances déclarées dans le fichier projet pom.xml à partir du référentiel central ou privé dans le répertoire $ M2_HOME / repository. La valeur par défaut de M2_HOME est $ HOME / .m2. Tous les projets Java sur la machine de développement partagent le package JAR sous ce répertoire de référentiel local. Au stade mvn package, tous les packages JAR dépendants sont emballés dans le produit final. Par conséquent, les projets Java s'exécutent indépendamment des fichiers du répertoire $ M2_HOME / repository.

pip Actuellement, le gestionnaire de packages le plus populaire et le plus recommandé pour Python est pip. Avant de comprendre comment installer un package d'installation dans votre répertoire local, vous devez vous familiariser avec le gestionnaire de packages Python. Pour mieux comprendre, voici une brève description de l'historique de développement de Python Package Manager.

Avant 2004, setup.py était recommandé pour les installations Python. Pour l'utiliser, téléchargez n'importe quel module et utilisez le fichier setup.py fourni avec ce module.

python setup.py install

setup.py est développé à partir de Distutils. Publié dans le cadre du référentiel Python standard en 2000, Distutils est utilisé pour construire et installer des modules Python.

Par conséquent, utilisez setup.py pour les modules Python et

python setup.py sdist

Vous pouvez également regrouper le module dans un fichier RPM ou EXE.

python setup.py bdist_rpm
python setup.py bdist_wininst

Comme MakeFile, setup.py est également disponible pour la construction et l'installation. Cependant, comme les processus de construction et d'installation sont intégrés, vous devez créer le module à chaque fois que vous l'installez, ce qui gaspille des ressources. En 2004, la communauté Python a publié des outils de configuration, dont l'outil easy_install. Plus tard, Python a commencé à prendre en charge le format EGG et a introduit le référentiel en ligne PyPi.

Le référentiel de modules en ligne PyPi présente deux avantages importants.

  1. Il vous suffit d'installer le package EGG compilé, ce qui améliore l'efficacité.
  2. Téléchargez et installez automatiquement les packages dépendants à partir de PyPi.

Depuis sa sortie en 2008, pip a progressivement remplacé easy_install et est devenu le gestionnaire de paquets Python standard de facto. Étant compatible avec le format EGG, pip préfère le format Wheel et prend en charge l'installation de modules à partir de référentiels de versions de code (par exemple GitHub).

Ce qui suit décrit la structure de répertoires des modules Python. Les répertoires des fichiers d'installation EGG et Wheel sont divisés en cinq catégories: purelib, platlib, en-têtes, scripts et données.

Directory Installation location Purpose
purelib $prefix/lib/pythonX.Y/site-packages Pure Python implementation library
platlib $exec-prefix/lib/pythonX.Y/site-packages Platform-related DLL
headers $prefix/include/pythonX.Yabiflags/distname C header files
script $prefix/bin Executable files
data $prefix Data files, such as .conf configuration files and SQL initialization files

prefix et $ exec-prefix sont des paramètres du compilateur Python qui peuvent être obtenus à partir de sys.prefix et sys.exec_prefix. Les deux valeurs par défaut sous Linux sont / usr / local.

npm npm est un gestionnaire de packages Node.js. L'exécution de la commande npm install téléchargera les packages dépendants dans le sous-répertoire node_modules sous le répertoire actuel. Tous les packages dépendants de l'exécution de Node.js sont inclus dans le répertoire actuel. Cependant, certaines bibliothèques Node.js dépendent de l'environnement local qui a été créé lors de l'installation du module. Les bibliothèques dépendantes localement ne peuvent pas être exécutées si l'environnement de construction (tel que Windows) et l'environnement d'exécution (tel que Linux) sont différents. En outre, si la bibliothèque de développement ou la bibliothèque d'exécution est installée au moment de la construction, le DDL (tel qu'apt-get) qui a été installé localement dans le gestionnaire de packages du système d'exploitation peut ne pas exister dans le conteneur sous l'environnement d'exécution.

Problèmes de dépannage

Voyons ensuite comment résoudre les problèmes qui se produisent lorsque les bibliothèques dépendantes de Function Compute sont installées.

Bibliothèques dépendantes installées dans le répertoire système global

Maven et pip installent les packages dépendants dans un répertoire système autre que le répertoire du projet. Lorsque le projet est construit, Maven regroupe tous les packages dépendants externes dans le produit final. Par conséquent, les projets gérés par Maven sont exempts de problèmes de dépendance au moment de l'exécution. Pour les projets JAVA qui ne sont pas gérés par Maven, il est également courant de placer des packages JAR dépendants dans le répertoire courant ou ses sous-répertoires et de les intégrer dans le produit final. De cette manière, vous pouvez éviter les problèmes de dépendance lors de l'exécution de Java. Cependant, de tels problèmes se produisent dans les environnements Python gérés par pip. pip installe les dépendances dans le répertoire système, mais l'environnement de production Function Compute (à l'exception du répertoire / tmp) est en lecture seule et ne peut pas créer un environnement préfabriqué.

Dépendances natives

Les fichiers de bibliothèque Python et Node.js communs dépendent de l'environnement natif du système. Vous devez installer le DDL pour les environnements de compilation et d'exécution, ce qui entraîne une mauvaise portabilité dans les deux cas.

Lorsque Function Compute s'exécute sur Debian ou Ubuntu, le package APT est utilisé pour gérer les programmes et bibliothèques d'installation du système. Par défaut, ces programmes et bibliothèques sont installés dans le répertoire système (par exemple, / usr / bin, / usr / lib, / usr / local / bin, / usr / local / lib). Je vais. Par conséquent, les dépendances natives doivent également être installées dans le répertoire local.

Solution recommandée

Voici quelques solutions intuitives.

  1. Assurez-vous que le système de développement pour l'installation des dépendances correspond au système d'exécution de production. Utilisez fcli sbox pour installer les dépendances.

  2. Placez tous les fichiers de dépendance dans votre répertoire local. Copiez le module, l'exécutable, le fichier .dl ou .so de pip dans le répertoire courant. Cependant, il est en fait difficile de placer le fichier de dépendance dans le répertoire courant.

  3. Les fichiers de bibliothèque installés par pip et apt-get sont dispersés dans différents répertoires. Cela signifie que vous devez être familiarisé avec les différents gestionnaires de packages pour trouver ces fichiers.

  4. Les fichiers de bibliothèque ont des dépendances de transition. Lorsqu'une bibliothèque est installée, d'autres bibliothèques dont elle dépend sont également installées. Pour cette raison, obtenir ces dépendances manuellement peut être très fastidieux. Dans ce cas, comment installer manuellement les dépendances dans le répertoire actuel avec une intervention manuelle minimale? Ce qui suit décrit certaines des méthodes utilisées par pip et APT Package Manager et compare leurs forces et leurs faiblesses.

Installation des dépendances sur le répertoire courant

Python

Méthode 1: utilisez le paramètre --install-option.
pip install --install-option="--install-lib=$(pwd)" PyMySQL

L'utilisation de --install-option transmettra les paramètres à setup.py. Cependant, les fichiers .egg et .whl n'incluent pas le fichier setup.py. Par conséquent, l'utilisation de --install-option lance la procédure d'installation basée sur le paquet de code source et setup.py lance le processus de construction du module.

--install-option prend en charge les options suivantes:

File type Option
Python modules --install-purelib
extension modules --install-platlib
all modules --install-lib
scripts --install-scripts
data --install-data
C headers --install-headers

Si vous utilisez --install-lib, les valeurs de --install-purelib et --install-platlib seront écrasées.

De plus, --install-option =" --prefix = $ (pwd) " prend en charge l'installation dans le répertoire courant, mais sous le répertoire courant il dit lib / python2.7 / site-packages. Un sous-répertoire est créé.

avantage.

  1. Vous pouvez installer le module dans un répertoire local tel que purelib. Inconvénients: les modules peuvent être installés dans un répertoire local tel que purelib.

  2. Non applicable aux modules qui n'incluent pas le package de code source.

  3. Construisez un système sans utiliser pleinement le package Wheel.

  4. Pour installer complètement le module, il est nécessaire de définir plus de paramètres, ce qui est gênant.

** Méthode 2: utilisez le paramètre --target ou -t **

pip install --target=$(pwd) PyMySQL

--target est un nouveau paramètre fourni par pip. Ce paramètre installe le module directement dans le répertoire courant sans créer le sous-répertoire lib / python2.7 / site-packages. Cette méthode est facile à utiliser et peut être appliquée à des modules qui ont plusieurs dépendances.

** Méthode 3: Utilisez PYTHONUSERBASE avec --user **

PYTHONUSERBASE=$(pwd) pip install --user PyMySQL

Si vous utilisez ʻuser, le module sera installé dans le répertoire site.USER_BASE. La valeur par défaut de ce répertoire est ~ / .local sous Linux, ~ / Library / Python / X.Y sous MacOSet% APPDATA% Pythonsous Windows. Vous pouvez modifier la valeur desite.USER_BASE en utilisant la variable d'environnement PYTHONUSERBASE`.

Comme avec prefix =, l'utilisation de --user crée un sous-répertoire appelé lib / python2.7 / site-packages.

** Méthode 4: utilisez virtualenv **

pip install virtualenv
virtualenv path/to/my/virtual-env
source path/to/my/virtual-env/bin/activate
pip install PyMySQL

virutalenv est la méthode recommandée par la communauté Python pour ne pas polluer l'environnement global. Avec virtualenv, le module souhaité (tel que PyMySQL) et le gestionnaire de packages (tel que setuptools, pip, wheel) sont stockés dans un répertoire local. Ces modules augmentent la taille du package mais ne sont pas utilisés lors de l'exécution.

apt-get Le DDL et les fichiers exécutables installés par apt-get doivent également être installés dans le répertoire local. J'ai essayé les méthodes chroot et ʻapt-get -o RootDir = $ (pwd) recommandées sur Internet, mais elles étaient défectueuses et ont été rejetées. Sur la base de la méthode précédente, nous avons conçu une méthode pour télécharger le paquet DEB en utilisant ʻapt-get et l'installer en utilisant dpkg.

apt-get install -d -o=dir::cache=$(pwd) libx11-6 libx11-xcb1 libxcb1
for f in $(ls ./archives/*.deb)
do 
    dpkg -x $pwd/archives/$f $pwd
done

Méthode de course

Java charge les jars et les fichiers de classe en définissant le chemin de classe, mais nodejs charge automatiquement les packages sous node_modules dans le répertoire courant. Ces opérations générales sont omises ici.

Python Python charge les fichiers de module à partir de la liste de répertoires pointée par sys.path.

> import sys
> print '\n'.join(sys.path)

/usr/lib/python2.7
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
/usr/local/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages

Par défaut, sys.path contient le répertoire actuel. Donc, si vous utilisez les paramètres --target ou -t dans la deuxième méthode, le module est installé dans le répertoire courant et vous pouvez ignorer le paramètre sys.path.

Puisque sys.path est un tableau modifiable, vous pouvez utiliser sys.path.append (dir) lors du démarrage du programme. Vous pouvez également utiliser la variable d'environnement PYTHONPATH pour améliorer la portabilité du programme.

export PYTHONPATH=$PYTHONPATH:$(pwd)/lib/python2.7/site-packages

apt-get Assurez-vous que les fichiers exécutables et DDL installés à l'aide d'apt-get sont disponibles dans la liste de répertoires définie par les variables d'environnement PATH et LD_LIBRARY_PATH.

PATH

La variable PATH affiche la liste des répertoires que le système utilise pour rechercher des programmes exécutables. Ajoutez des répertoires bin ou sbin tels que bin, usr / bin, usr / local / bin à la variable PATH.

export PATH=$(pwd)/bin:$(pwd)/usr/bin:$(pwd)/usr/local/bin:$PATH

Le contenu ci-dessus s'applique également à Bash. Pour Java, Python et node.js, effectuez les ajustements appropriés lors de la modification de la variable d'environnement PATH du processus en cours.

LD_LIBRARY_PATH

Comme PATH, LD_LIBRARY_PATH est une liste de répertoires dans lesquels vous pouvez rechercher DDL. Normalement, le système place des liens dynamiques dans les répertoires / lib, / usr / lib, / usr / local / lib. Certains modules sont placés dans des sous-répertoires de ces répertoires, tels que / usr / lib / x86_64-linux-gnu. Ces sous-répertoires sont généralement enregistrés dans des fichiers sous / etc / ld.so.conf.d /.

cat /etc/ld.so.conf.d/x86_64-linux-gnu.conf
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

Par conséquent, le fichier so dans le répertoire déclaré dans le fichier sous $ (pwd) / etc / ld.so.conf.d / doit également être obtenu à partir de la liste de répertoires définie par la variable d'environnement LD_LIBRARY_PATH.

Notez que la modification de la variable d'environnement LD_LIBRARY_PATH au moment de l'exécution peut ne pas prendre effet. La variable d'environnement LD_LIBRARY_PATH prédéfinit le répertoire / code / lib. Par conséquent, tous les fichiers dépendants peuvent être liés au répertoire / code / lib.

Conclusion

Ce document décrit comment exécuter les commandes pip et apt-get pour installer la bibliothèque dans un répertoire local et définir les variables d'environnement au moment de l'exécution afin que vous puissiez trouver le fichier de bibliothèque local où le programme a été installé. Explique.

Les quatre méthodes fournies par Python sont applicables à n'importe quel scénario courant. Malgré les légères différences décrites ci-dessus, vous pouvez choisir la bonne méthode pour vos besoins.

apt-get est une autre méthode. Par rapport aux autres méthodes, cette méthode ne vous oblige pas à installer le package deb qui est déjà installé sur votre système, vous pouvez donc réduire la taille du package. Pour le rendre encore plus petit, vous pouvez supprimer les fichiers installés indésirables tels que les manuels d'utilisation.

Ce livre fait partie de l'accumulation de technologies pour personnaliser de meilleurs outils. Sur cette base, nous souhaitons fournir de meilleurs outils et simplifier le développement à l'avenir.

Les références

1, Comment python trouve-t-il le package? 2, Guide de l'utilisateur Pip 3、python-lambda-local 4、python-lambda 5, Guide de l'outil de gestion des packages Python 6, Exécutez-vous apt-get pour une autre partition / répertoire?

Recommended Posts

Installation de bibliothèques dépendantes pour le calcul de la fonction cloud Alibaba
Installation de l'agent OMC Cloud --Linux-
Vitesse de calcul de l'indexation pour un tableau quadratique numpy