[PYTHON] Stolpern über dynamische Verbindung beim Ausführen von Binärdateien in Pyinstaller (Linux) Behoben

Überblick

** Pyinstaller ** https://github.com/pyinstaller/pyinstaller ist eine dankbare Bibliothek, die ein mit Python erstelltes Programm in eine ausführbare Datei umwandelt.

Wenn Sie damit den Python-Code in einer Binärdatei oder einem Ordner ablegen, Als ich die Binärdatei in eine andere Umgebung brachte und versuchte, sie auszuführen, wurde ich wütend über dynamische Links und blieb stecken.

Umgebung & Befehl verwendet

Umgebung:

pyinstaller -D --clean --onefile --additional-hooks-dir ./ main.py

Verwenden Sie diesen Befehl, um `` `main.py``` in onefile (Binärdatei) umzuwandeln. Ich wollte es in anderen Umgebungen verwenden. (Eigentlich habe ich diese Binärdatei in das Docker-Image eingefügt und versucht, sie mit Docker auszuführen.)

Error


| [7] Error loading Python lib '/tmp/_MEIzvSj0a/libpython3.6m.so.1.0': dlopen: libexpat.so.1: cannot open shared object file: No such file or directory

Erwägung

so file Ich bin wütend ohne es. Ich dachte, dass die von pyinstaller erstellte Onefile nicht von der Ausführungsumgebung abhängt. Machst du eigentlich dynamische Verknüpfungen? ??

Als ich nachgeschlagen habe, habe ich viele Dinge gefunden. Erstens, auch wenn es mit pyinstaller eine Datei wird https://github.com/pyinstaller/pyinstaller/wiki/FAQ Wie Sie hier sehen können

GNU/Linux Under Linux, I get runtime dynamic linker errors, related to libc. What should I do? The executable that PyInstaller builds is not fully static, in that it still depends on the system libc.

Und das. Mit anderen Worten, es hängt von Linux ab, da es Bibliotheken gibt, auf die natürlich dynamisch verwiesen wird. Hier wurde folgendes geschrieben.

Another solution is to use a tool like StaticX to create a fully-static bundled version of your PyInstaller application. StaticX bundles all dependencies, including libc and ld.so. (Python code :arrow_right: PyInstaller :arrow_right: StaticX :arrow_right: Fully-static application)

staticxWie wäre es mit einer vollständig statischen Bibliothek? Es war das. Ich habe es entsprechend versucht.

Das Git-Repository ist https://github.com/JonathonReinhart/static Hier ist es. Ich habe dies verwendet, um die dynamische Abhängigkeit dessen zu verringern, was mit `` pyinstaller``` und weiter mit `staticx``` zu einer Datei wurde.

Als Ergebnis wurde festgestellt, dass die hier erstellte Binärdatei sicher in der Docker-Umgebung "Ubuntu" (wie in der Entwicklungsumgebung) ausgeführt werden kann.

Warum müssen wir also dynamisch verknüpfen?

Ich bin der Meinung, dass viele Dinge, die dynamisch miteinander verbunden sind, umweltabhängiger werden. Warum machst du dynamische Verknüpfungen?

http://archive.linux.or.jp/JF/JFdocs/libc-intro.html Es beschreibt die Geschichte der "libc", die das Linux-System für seine Operationen verwendet. Ich werde ein wenig über die Erklärung von statischen und dynamischen Links zitieren.

Bei Verwendung einer statischen Bibliothek benötigt der Linker ein Programm Suchen Sie das Teil, das Sie verwenden möchten, und kopieren Sie es in die ausführbare Ausgabedatei. Bei gemeinsam genutzten Bibliotheken ist die Arbeit anders. Der Linker sagt in der Ausgabedatei: "Wenn dieses Programm ausgeführt wird, Zunächst müssen diese und diese Bibliothek geladen werden. " Betten Sie die Nachricht ein. Also offensichtlich die gemeinsam genutzte Bibliothek Die Größe der ausführbaren Datei ist kleiner, wenn Sie sie verwenden. Es verbraucht auch weniger Speicher und Speicherplatz. Unter Linux Das Standardverhalten ist die Verwendung der gemeinsam genutzten Bibliothek, falls vorhanden. Wenn nicht, wird es statisch verknüpft. Freigegebene Bibliothek für ausführbare Dateien Wenn Sie es formatieren möchten, es aber statisch wird, platzieren Sie es an der richtigen Position Ich habe eine gemeinsam genutzte Bibliotheksdatei (* .sa für a.out, * .so für ELF) Überprüfen Sie, ob sie lesbar sind.

Mit anderen Worten, es ist nicht gut, statische Links zu streuen, damit alles unabhängig von der Umgebung ist. (Das heißt, meine Gedanken waren flach.)

Nachtrag

Wenn Sie mit pyinstaller einen Ordner anstelle einer Datei ausgeben

cannot find libexpat.so

Ich habe so einen Fehler bekommen. Dies besagt, dass bei Verwendung von `libpython3.6m.so```` libexpat.so``` auch dynamisch verknüpft werden musste, sodass es sich zu diesem Zeitpunkt nicht im Docker-Container befindet. Es war ein Fehler.

Ich habe darüber nachgedacht, aber die schnelle Lösung ist Es war, dieses `libexpat.so``` normalerweise mit` apt-get install libexpat-dev` `` auf dem Container zu installieren.

Zusammenfassung

Beachten Sie bei der Verwendung von ** pyinstaller ** unter Linux, dass es Bibliotheken gibt, die auch dann dynamisch verknüpft sind, wenn sie zu einer Datei werden. Wenn Sie zur Laufzeit mit einem Linkproblem wütend werden

das ist alles.

Diesmal hier.

Ende.

Recommended Posts

Stolpern über dynamische Verbindung beim Ausführen von Binärdateien in Pyinstaller (Linux) Behoben
Der Tag, an dem der unter Linux unter AWS ausgeführte Flask-Server semi-persistent war (im Hintergrund ausgeführt)
Beseitigen Sie die Passworteingabe, wenn Sie sudo ~~ auf Linux-PCs ausführen!
Ein Fehler beim Einfügen von Pygame in Python3 auf Himbeer-Pi wurde behoben