Informationen zur Option --enable-shared beim Erstellen von Python unter Linux

Beim Erstellen von Python unter Linux gibt es eine Konfigurationsoption namens "--enable-shared". Ich werde dies erklären und Ihnen einige Tipps geben. Ich habe Python als konkretes Beispiel gegeben, aber ich denke, dass der größte Teil des Inhalts anderen Sprachen und Bibliotheken gemeinsam ist.

Was ist --enable-shared?

Wenn Sie diese Option nicht angeben, haben Sie eine ausführbare Datei mit dem Namen "python" und eine Bibliotheksdatei mit dem Namen "libpython2.7.a" (für Python 2.7) als Hauptbinärdateien. Wenn Sie "--enable-shared" hinzufügen, wird auch ein freigegebenes Objekt für eine dynamische Verknüpfung mit dem Namen "libpython2.7.so" generiert, und "python" verknüpft dieses freigegebene Objekt dynamisch.

Linux-Distributionen wie Debian erstellen normalerweise Python mit dieser Option. Dies liegt daran, dass viele Programme für die Verwendung von Python erstellt wurden. Wenn Sie "libpython2.7.a" direkt verknüpfen, müssen Sie alle aktualisieren, wenn Sie Python aktualisieren.

Ich empfehle "--enable-shared" nicht, da dieser Vorteil, wenn Sie Python selbst erstellen, nicht wirklich zum Leben erweckt wird, sondern für jeden ärgerlich sein kann, der mehrere Versionen gleichzeitig verwenden möchte. Wenn Sie aus irgendeinem Grund kein freigegebenes Objekt verwenden möchten, müssen Sie den Rest nicht lesen.

Probleme bei der Verwendung von --enable-shared

Wenn eine ausführbare Python-Datei oder ein Programm, das Python als Bibliothek verknüpft, wie z. B. mod_wsgi, von libpython2.7.so abhängig wird, lautet das laufende Programm erwartungsgemäß libpython2.7.so. Es besteht die Möglichkeit, dass Sie nicht verwenden.

Wenn Sie beispielsweise mit --prefix = / usr / local / Python-2.7.3 erstellen und installieren, können Sie / usr / local / Python-2.7.3 / bin / python ausführen, um Umgebungsvariablen festzulegen. Je nach Situation kann "/ usr / lib / libpython2.7.so" oder "/ usr / local / Python-2.7.2 / lib / libpython2.7.so" verwendet werden.

Sie können die Umgebungsvariable LD_LIBRARY_PATH verwenden, um den Speicherort der Bibliothek anzugeben, die bevorzugt geladen werden soll. Wenn Sie jedoch mehrere Versionen von Python parallel verwenden, ist es schwierig, die Umgebungsvariable selbst zu wechseln. Wenn eine andere Person denselben Server verwendet, kann diese Person verwirrt sein.

Gegenmaßnahme 1 Pfad einstellen

Vielleicht ist dies ein unkomplizierter Ansatz. Der Speicherort der Verknüpfung "libpython2.7.so" wird mit dem vollständigen Pfad auf der Seite aufgezeichnet, die die dynamische Verknüpfung herstellt, z. B. die ausführbare Datei "python".

Um den Pfad festzulegen, können Sie bei der Konfiguration einfach LDFLAGS angeben.

$ ./configure --prefix=$HOME/python27 --enable-shared \
    LDFLAGS=-Wl,-rpath,$HOME/python27/lib

Der einzige Nachteil bei der Verwendung von rpath besteht darin, dass die Portabilität des Kopierens des gesamten Python in ein anderes Verzeichnis mit cp -r usw. und des Umschreibens des Shebang im Skript in bin / beeinträchtigt wird. Wenn sich in virtualenv libpython2.7.so am ursprünglichen Speicherort befindet, funktioniert es weiterhin, sodass es kein Problem gibt. Wenn Sie jedoch virtualenv verwenden, wissen Sie nicht, wie lange die alte Version von Python verwendet wird, und Sie möchten sie nicht löschen. Kopieren Sie also das Ganze Es wird nicht für Personen empfohlen, die es verwenden möchten.

Gegenmaßnahme 2 Verknüpfen Sie libpython statisch

Wenn Sie ein freigegebenes Objekt für einen bestimmten Zweck benötigen, die ausführbare Python-Datei es jedoch nicht dynamisch verknüpfen muss, gibt es eine Möglichkeit, libpython2.7.a beim Erstellen von Python zu verknüpfen. .. Öffnen Sie dazu Makefile nach Konfiguration und

BLDLIBRARY=     -L. -lpython$(VERSION)

Wo ist es

BLDLIBRARY=     libpython$(VERSION).a

Ich werde es umschreiben.

Das Debian-Paket Python scheint mit libpython2.7.so auf ähnliche Weise aufgebaut zu sein, aber Python verknüpft libpython statisch. Der Grund scheint zu sein, dass das gemeinsam genutzte Objekt PIC war und eine schlechte Leistung aufwies. (Dies ist auch der Grund, warum vim Python 2 und 3 nicht gleichzeitig verwenden kann.)

Recommended Posts

Informationen zur Option --enable-shared beim Erstellen von Python unter Linux
Erstellen mehrerer Python-Umgebungen auf demselben System
Überlegen Sie, wie Sie Python auf Ihrem iPad programmieren können
Die Welt veränderte sich, als ich ein großes Python-Projekt (Django) auf Sourcetrail (Linux) eröffnete.
Über das Python-Modul venv
Installieren Sie JDK unter Linux
Über die Aufzählungsfunktion (Python)
Fügen Sie den Link unter Linux ein
Über die Funktionen von Python
Hinweise zum Erstellen von TinyEMU und zum Booten des Linux-Kernels auf Emscripten
Verhalten am Ende von Linux weniger abhängig von der Verbindungsquelle
Erstellen einer Python-Umgebung auf einem Mac
Installieren Sie Python Pillow unter Amazon Linux
Überprüfen Sie das Verhalten beim Zuweisen von Python
Erstellen einer Python-Umgebung unter Ubuntu
Unterstützung bei der Installation von Pillon auf Python3.9
[Python] Was ist @? (Über Dekorateure)
Erstellen einer Python-Umgebung unter Ubuntu (wenn pip nicht die Standardeinstellung war)
Sakura Verwenden von Python im Internet
Führen Sie die Python 3.5.2-Umgebung unter Amazon Linux ein
python> os.path.join ('data', 'checkpoint')> 'data / checkpoint' unter Linux
Informationen zur Grundlagenliste der Python-Grundlagen
Über den Fehler, den ich beim Versuch, Adafruit_DHT von Python auf Raspberry Pi zu verwenden, festgestellt habe
Die Option --security kann unter CentOS Linux nicht mit dem Befehl dnf verwendet werden
[Python Kivy] Über das Ändern des Designthemas
Erstellen Sie ScriptableObject in Python, wenn Sie ADX2 erstellen
Suchen Sie nach Dateien wie Linux Find in Python
Informationen zur virtuellen Umgebung von Python Version 3.7
[C] [Python] Lesen mit AquesTalk unter Linux
Hinweise zum Erstellen von Python und Pyenv auf dem Mac
Laden Sie mit Python Dateien im Web herunter
Benachrichtigen Sie Slack, wenn der Linux-Befehl beendet ist
[Python] Ein Fortschrittsbalken auf dem Terminal
Installieren Sie Python 3.8, Pip 3.8 auf EC2 (Amazon Linux 2)
Kompilieren des Linux-Kernels (Linux 5.x unter Ubuntu 20.04)
So aktualisieren Sie die Software beim Erstellen von Linux (CentOS) mit Vagrant ~ Am Beispiel eines Upgrades von Python 2.7 auf Python 3.6 ~
Bei der Konvertierung von CSV in JSON mit Python bin ich auf einen Zeichencode gestoßen
Der Tag, an dem der unter Linux unter AWS ausgeführte Flask-Server semi-persistent war (im Hintergrund ausgeführt)
Über Linux
Über Linux
Über Linux
Korrespondenznotiz, wenn die Richtungstaste nicht in der Python-Befehlszeile verwendet werden kann
Über Linux
Verwenden Sie Python auf Raspberry Pi 3, um die LED zu beleuchten, wenn es dunkel wird!
Ein Java-Programmierer studierte Python. (Über Dekorateure)
[Linux] Wenn "| (Pipe)" unter CentOS7 nicht getroffen werden kann
[2020Juli] Überprüfen Sie die UDID des iPad unter Linux
Über den Unterschied zwischen "==" und "is" in Python
Hinweis zur Codierung bei LANG = C in Python
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Probieren Sie CI den Push-Python-Code auf GitHub aus.
Einführung in Python mit Atom (unterwegs)
Ein Memorandum über die Python-Tesseract-Wrapper-Bibliothek