[PYTHON] Installation abhängiger Bibliotheken für die Berechnung der Alibaba-Cloud-Funktion

Dieser Artikel beschreibt die Verwendung vorhandener Tools zum Installieren abhängiger Bibliotheken in einem ** Function Compute ** -Projekt mit minimalem manuellen Eingriff.

Installationsverzeichnis des Paketmanagers

Derzeit unterstützt Function Compute (https://www.alibabacloud.com/en/products/function-compute) Java-, Python- und Node.js-Umgebungen. Die Paketmanager für diese drei Sprachen sind Maven, Pip und NPM. Im Folgenden werden die Installationsverzeichnisse für jeden dieser Paketmanager beschrieben.

Maven Maven ist ein Java-Paketmanager. Maven lädt die in der Projektdatei pom.xml deklarierten Abhängigkeiten aus dem zentralen oder privaten Repository in das Verzeichnis "$ M2_HOME / repository" herunter. Der Standardwert für "M2_HOME" ist "$ HOME / .m2". Alle Java-Projekte auf dem Entwicklungscomputer teilen sich das JAR-Paket in diesem lokalen Repository-Verzeichnis. In der Phase "MVN-Paket" werden alle abhängigen JAR-Pakete im Endprodukt verpackt. Daher werden Java-Projekte unabhängig von den Dateien im Verzeichnis "$ M2_HOME / repository" ausgeführt.

pip Derzeit ist pip der beliebteste und empfohlene Paketmanager für Python. Bevor Sie verstehen, wie Sie ein Installationspaket in Ihrem lokalen Verzeichnis installieren, müssen Sie sich mit dem Python Package Manager vertraut machen. Zum besseren Verständnis finden Sie im Folgenden eine kurze Beschreibung des Entwicklungsverlaufs von Python Package Manager.

Vor 2004 wurde setup.py für Python-Installationen empfohlen. Laden Sie dazu ein beliebiges Modul herunter und verwenden Sie die mit diesem Modul gelieferte Datei setup.py.

python setup.py install

setup.py wurde aus Distutils entwickelt. Distutils wurde im Jahr 2000 als Teil des Python-Standard-Repositorys veröffentlicht und wird zum Erstellen und Installieren von Python-Modulen verwendet.

Verwenden Sie daher setup.py für Python-Module und

python setup.py sdist

Sie können das Modul auch in eine RPM- oder EXE-Datei packen.

python setup.py bdist_rpm
python setup.py bdist_wininst

Wie MakeFile steht auch setup.py zum Erstellen und Installieren zur Verfügung. Da die Erstellungs- und Installationsprozesse jedoch integriert sind, müssen Sie das Modul bei jeder Installation erstellen, wodurch Ressourcen verschwendet werden. Im Jahr 2004 veröffentlichte die Python-Community Setup-Tools, einschließlich des easy_install-Tools. Später unterstützte Python das EGG-Format und führte das Online-Repository PyPi ein.

Das Online-Modul-Repository PyPi bietet zwei wichtige Vorteile.

  1. Sie müssen nur das kompilierte EGG-Paket installieren, um die Effizienz zu verbessern.
  2. Laden Sie abhängige Pakete automatisch von PyPi herunter und installieren Sie sie.

Seit seiner Veröffentlichung im Jahr 2008 hat pip easy_install schrittweise ersetzt und ist zum De-facto-Standard-Python-Paketmanager geworden. Pip ist mit dem EGG-Format kompatibel und bevorzugt das Wheel-Format. Es unterstützt die Installation von Modulen aus Code-Versions-Repositorys (z. B. GitHub).

Im Folgenden wird die Verzeichnisstruktur von Python-Modulen beschrieben. Die Verzeichnisse für EGG- und Wheel-Installationsdateien sind in fünf Kategorien unterteilt: Purelib, Platlib, Header, Skripte und Daten.

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 und $ exec-prefix sind Python-Compilerparameter, die aus sys.prefix und sys.exec_prefix abgerufen werden können. Beide Standardeinstellungen unter Linux sind "/ usr / local".

npm npm ist ein Node.js-Paketmanager. Durch Ausführen des Befehls npm install werden die abhängigen Pakete in das Unterverzeichnis node_modules unter dem aktuellen Verzeichnis heruntergeladen. Alle zur Laufzeit abhängigen Pakete von Node.j sind im aktuellen Verzeichnis enthalten. Einige Node.js-Bibliotheken hängen jedoch von der lokalen Umgebung ab, die bei der Installation des Moduls erstellt wurde. Lokal abhängige Bibliotheken können nicht ausgeführt werden, wenn sich die Build-Umgebung (z. B. Windows) und die Laufzeitumgebung (z. B. Linux) unterscheiden. Wenn die Entwicklungsbibliothek oder Laufzeitbibliothek zur Erstellungszeit installiert wird, ist die DDL (z. B. apt-get), die lokal im Paketmanager des Betriebssystems installiert wurde, möglicherweise nicht im Container unter der Laufzeitumgebung vorhanden.

Fehlerbehebung

Schauen wir uns als Nächstes an, wie Probleme behoben werden, die auftreten, wenn die abhängigen Bibliotheken von Function Compute installiert werden.

Abhängige Bibliotheken im globalen Systemverzeichnis #### installiert

Maven und pip installieren abhängige Pakete in einem anderen Systemverzeichnis als dem Projektverzeichnis. Wenn das Projekt erstellt wird, packt Maven alle externen abhängigen Pakete in das Endprodukt. Infolgedessen sind von Maven verwaltete Projekte zur Laufzeit frei von Abhängigkeitsproblemen. Bei JAVA-Projekten, die nicht von Maven verwaltet werden, ist es auch üblich, abhängige JAR-Pakete im aktuellen Verzeichnis oder seinen Unterverzeichnissen abzulegen und im Endprodukt zu verpacken. Auf diese Weise können Sie Abhängigkeitsprobleme beim Ausführen von Java vermeiden. Solche Probleme treten jedoch in von Pip verwalteten Python-Umgebungen auf. pip installiert die Abhängigkeiten im Systemverzeichnis, aber die Function Compute-Produktionsumgebung (mit Ausnahme des Verzeichnisses / tmp) ist schreibgeschützt und kann keine vorgefertigte Umgebung erstellen.

Native Abhängigkeiten

Allgemeine Python- und Node.js-Bibliotheksdateien hängen von der nativen Umgebung des Systems ab. Sie müssen die DDL für die Kompilierungs- und Laufzeitumgebung installieren, was in beiden Fällen zu einer schlechten Portabilität führt.

Wenn Function Compute unter Debian oder Ubuntu ausgeführt wird, wird das APT-Paket zum Verwalten von Systeminstallationsprogrammen und -bibliotheken verwendet. Standardmäßig werden diese Programme und Bibliotheken im Systemverzeichnis installiert (z. B. "/ usr / bin", "/ usr / lib", "/ usr / local / bin", "/ usr / local / lib"). Ich werde. Daher müssen native Abhängigkeiten auch im lokalen Verzeichnis installiert werden.

Empfohlene Lösung

Im Folgenden finden Sie einige intuitive Lösungen.

  1. Stellen Sie sicher, dass das Entwicklungssystem zum Installieren der Abhängigkeiten mit dem Produktionsausführungssystem übereinstimmt. Verwenden Sie fcli sbox, um die Abhängigkeiten zu installieren.

  2. Platzieren Sie alle Abhängigkeitsdateien in Ihrem lokalen Verzeichnis. Kopieren Sie das Modul, die ausführbare Datei, die DLL- oder die SO-Datei von pip in das aktuelle Verzeichnis. Es ist jedoch tatsächlich schwierig, die Abhängigkeitsdatei im aktuellen Verzeichnis abzulegen.

  3. Von pip und apt-get installierte Bibliotheksdateien sind in verschiedenen Verzeichnissen verteilt. Dies bedeutet, dass Sie mit verschiedenen Paketmanagern vertraut sein müssen, um diese Dateien zu finden.

  4. Bibliotheksdateien haben Übergangsabhängigkeiten. Wenn eine Bibliothek installiert ist, werden auch andere Bibliotheken installiert, von denen sie abhängt. Aus diesem Grund kann es sehr mühsam sein, diese Abhängigkeiten manuell abzurufen. Wie können Sie in diesem Fall die Abhängigkeiten im aktuellen Verzeichnis mit minimalem manuellen Eingriff manuell installieren? Im Folgenden werden einige der von pip und dem APT Package Manager verwendeten Methoden beschrieben und ihre Stärken und Schwächen verglichen.

Abhängigkeitsinstallation im aktuellen Verzeichnis

Python

Methode 1: Verwenden Sie den Parameter --install-option.
pip install --install-option="--install-lib=$(pwd)" PyMySQL

Mit --install-option werden die Parameter an setup.py übergeben. Die Dateien .egg und .whl enthalten jedoch nicht die Datei setup.py. Wenn Sie also --install-option verwenden, wird die Installationsprozedur basierend auf dem Quellcodepaket gestartet, und setup.py startet den Modulerstellungsprozess.

--install-option unterstützt folgende Optionen:

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

Wenn Sie "--install-lib" verwenden, werden die Werte von "--install-purelib" und "--install-platlib" überschrieben.

Außerdem unterstützt --install-option =" --prefix = $ (pwd) " die Installation im aktuellen Verzeichnis, aber im aktuellen Verzeichnis steht lib / python2.7 / site-packages. Ein Unterverzeichnis wird erstellt.

Vorteil.

  1. Sie können das Modul in einem lokalen Verzeichnis wie purelib installieren. Nachteile: Module können in einem lokalen Verzeichnis wie purelib installiert werden.

  2. Gilt nicht für Module, die das Quellcodepaket nicht enthalten.

  3. Erstellen Sie ein System, ohne das Wheel-Paket vollständig zu nutzen.

  4. Um das Modul vollständig zu installieren, müssen weitere Parameter eingestellt werden, was problematisch ist.

** Methode 2: Verwenden Sie den Parameter --target oder -t **

pip install --target=$(pwd) PyMySQL

--target ist ein neuer Parameter, der von pip bereitgestellt wird. Dieser Parameter installiert das Modul direkt im aktuellen Verzeichnis, ohne das Unterverzeichnis "lib / python2.7 / site-packages" zu erstellen. Diese Methode ist einfach zu verwenden und kann auf Module mit mehreren Abhängigkeiten angewendet werden.

** Methode 3: Verwenden Sie PYTHONUSERBASE mit --user **

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

Wenn Sie "Benutzer" verwenden, wird das Modul im Verzeichnis "site.USER_BASE" installiert. Der Standardwert für dieses Verzeichnis ist unter Linux "~ / .local", unter MacOS "~ / Library / Python / X.Y" und unter Windows "% APPDATA% Python". Sie können den Wert von "site.USER_BASE" mit der Umgebungsvariablen "PYTHONUSERBASE" ändern.

Wie bei "prefix =" wird mit "--user" ein Unterverzeichnis mit dem Namen "lib / python2.7 / site-packages" erstellt.

** Methode 4: Verwenden Sie virtualenv **

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

virutalenv ist die von der Python-Community empfohlene Methode, da sie die globale Umgebung nicht verschmutzt. Mit virtualenv werden sowohl das gewünschte Modul (wie PyMySQL) als auch der Paketmanager (wie setuptools, pip, Wheel) in einem lokalen Verzeichnis gespeichert. Diese Module vergrößern das Paket, werden jedoch zur Laufzeit nicht verwendet.

apt-get Die von apt-get installierten DDL- und ausführbaren Dateien müssen ebenfalls im lokalen Verzeichnis installiert sein. Ich habe die im Internet empfohlenen Methoden chroot und apt-get -o RootDir = $ (pwd) ausprobiert, aber sie waren fehlerhaft und wurden verworfen. Basierend auf der vorherigen Methode haben wir eine Methode entwickelt, um das DEB-Paket mit "apt-get" herunterzuladen und mit "dpkg" zu installieren.

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

Ausführungsmethode

Java lädt Jars und Klassendateien durch Festlegen des Klassenpfads, aber nodejs lädt automatisch Pakete unter node_modules im aktuellen Verzeichnis. Diese allgemeinen Operationen werden hier weggelassen.

Python Python lädt die Moduldateien aus der Verzeichnisliste, auf die sys.path verweist.

> 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

Standardmäßig enthält sys.path das aktuelle Verzeichnis. Wenn Sie also in der zweiten Methode die Parameter --target oder -t verwenden, wird das Modul im aktuellen Verzeichnis installiert und Sie können die Einstellung sys.path ignorieren.

Da sys.path ein bearbeitbares Array ist, können Sie beim Starten des Programms sys.path.append (dir) verwenden. Sie können auch die Umgebungsvariable PYTHONPATH verwenden, um die Programmportabilität zu verbessern.

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

apt-get Stellen Sie sicher, dass die mit apt-get installierten ausführbaren Dateien und DDL in der Verzeichnisliste verfügbar sind, die durch die Umgebungsvariablen PATH und LD_LIBRARY_PATH festgelegt wurde.

PATH

Die Variable PATH zeigt die Liste der Verzeichnisse an, mit denen das System nach ausführbaren Programmen sucht. Fügen Sie der PATH-Variablen bin- oder sbin-Verzeichnisse wie bin, usr / bin, usr / local / bin hinzu.

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

Der obige Inhalt gilt auch für Bash. Nehmen Sie für Java, Python und node.js entsprechende Anpassungen vor, wenn Sie die Umgebungsvariable PATH des aktuellen Prozesses ändern.

LD_LIBRARY_PATH

LD_LIBRARY_PATH ist wie PATH eine Liste von Verzeichnissen, in denen Sie nach DDL suchen können. Normalerweise platziert das System dynamische Links in den Verzeichnissen / lib, / usr / lib, / usr / local / lib. Einige Module befinden sich in Unterverzeichnissen dieser Verzeichnisse, z. B. "/ usr / lib / x86_64-linux-gnu". Diese Unterverzeichnisse werden normalerweise in Dateien unter "/ etc / ld.so.conf.d /" aufgezeichnet.

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

Daher muss die so-Datei in dem Verzeichnis, das in der Datei unter $ (pwd) / etc / ld.so.conf.d / `deklariert ist, auch aus der Verzeichnisliste abgerufen werden, die von der Umgebungsvariablen LD_LIBRARY_PATH festgelegt wurde.

Beachten Sie, dass das Ändern der Umgebungsvariablen "LD_LIBRARY_PATH" zur Laufzeit möglicherweise nicht wirksam wird. Die Umgebungsvariable LD_LIBRARY_PATH legt das Verzeichnis / code / lib fest. Daher können alle abhängigen Dateien mit dem Verzeichnis / code / lib verknüpft werden.

Fazit

In diesem Dokument wird beschrieben, wie Sie die Befehle pip und apt-get ausführen, um die Bibliothek in einem lokalen Verzeichnis zu installieren und Umgebungsvariablen zur Laufzeit festzulegen, damit Sie die lokale Bibliotheksdatei finden, in der das Programm installiert wurde. Erklärt.

Die vier von Python bereitgestellten Methoden können auf jedes gängige Szenario angewendet werden. Trotz der oben beschriebenen geringfügigen Unterschiede können Sie die richtige Methode für Ihre Anforderungen auswählen.

apt-get ist eine andere Methode. Im Vergleich zu anderen Methoden müssen Sie für diese Methode nicht das Deb-Paket installieren, das bereits auf Ihrem System installiert ist, sodass Sie die Paketgröße reduzieren können. Um es noch kleiner zu machen, können Sie unerwünschte installierte Dateien wie Benutzerhandbücher entfernen.

Dieses Buch ist Teil der Ansammlung von Technologie, um bessere Werkzeuge anzupassen. Auf dieser Grundlage möchten wir in Zukunft bessere Tools bereitstellen und die Entwicklung vereinfachen.

Verweise

1, Wie findet Python das Paket? 2, Pip-Benutzerhandbuch 3、python-lambda-local 4、python-lambda 5, Python Package Management Tool-Handbuch 6, Führen Sie apt-get für eine andere Partition / ein anderes Verzeichnis aus?

Recommended Posts

Installation abhängiger Bibliotheken für die Berechnung der Alibaba-Cloud-Funktion
OMC Cloud Agent installieren --Linux-
Berechnungsgeschwindigkeit der Indizierung für ein numpy quadratisches Array