[PYTHON] Trébucher sur un lien dynamique lors de l'exécution d'un binaire dans Pyinstaller (Linux) Résolu

Aperçu

** Pyinstaller ** https://github.com/pyinstaller/pyinstaller est une bibliothèque reconnaissante qui transforme un programme créé avec python en un fichier exécutable.

Lorsque vous l'utilisez pour mettre le code python dans un fichier binaire ou un dossier, Lorsque j'ai apporté le fichier binaire dans un autre environnement et que j'ai essayé de l'exécuter, je me suis mis en colère contre la liaison dynamique et je suis resté bloqué.

Environnement et commande utilisés

environnement:

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

Utilisez cette commande pour transformer `` main.py '' en un seul fichier (fichier binaire) Je voulais l'utiliser dans d'autres environnements. (En fait, j'ai mis ce fichier binaire dans l'image docker et j'ai essayé de l'exécuter en utilisant docker)

Erreur


| [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

Considération

so file Je suis en colère sans ça. Je pensais que le fichier unique créé par pyinstaller ne dépendait pas de l'environnement d'exécution, Faites-vous réellement des liens dynamiques? ??

Quand j'ai recherché, j'ai trouvé beaucoup de choses. Premièrement, même si cela devient un fichier avec pyinstaller https://github.com/pyinstaller/pyinstaller/wiki/FAQ Comme vous pouvez le voir ici

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.

Et cela. En d'autres termes, cela dépend de Linux car il existe bien sûr des bibliothèques référencées dynamiquement. Ici, ce qui suit a été écrit.

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)

staticxPourquoi ne pas en faire une bibliothèque complètement statique? C'était ça. Je l'ai essayé en conséquence.

Le référentiel git est https://github.com/JonathonReinhart/static C'est ici. Je l'ai utilisé pour réduire la dépendance dynamique de ce qui est devenu un fichier avec pyinstaller et plus loin avec` `` `staticx

En conséquence, il a été constaté que le binaire créé ici peut être exécuté en toute sécurité dans l'environnement docker ubuntu (identique à l'environnement de développement).

Alors pourquoi avons-nous besoin de lier dynamiquement?

Je pense que s'il y a beaucoup de choses qui sont liées de manière dynamique, cela deviendra plus dépendant de l'environnement. Pourquoi faites-vous des liens dynamiques?

http://archive.linux.or.jp/JF/JFdocs/libc-intro.html Il décrit l'historique de la `` libc '' que le système Linux utilise pour ses opérations. Je citerai un peu l'explication des liens statiques et des liens dynamiques.

Lors de l'utilisation d'une bibliothèque statique, l'éditeur de liens a besoin d'un programme Recherchez la pièce que vous souhaitez utiliser et copiez-la dans le fichier exécutable de sortie. Pour les bibliothèques partagées, le travail est différent. L'éditeur de liens dit dans le fichier de sortie: «Lorsque ce programme s'exécute, Tout d'abord, ceci et cette bibliothèque doivent être chargés. " Incorporez le message. Alors évidemment la bibliothèque partagée La taille du fichier exécutable sera plus petite si vous l'utilisez. Il consomme également moins de mémoire et d'espace disque. Sous Linux Le comportement par défaut consiste à utiliser la bibliothèque partagée, le cas échéant. Sinon, il sera lié de manière statique. Bibliothèque partagée pour les fichiers exécutables Si vous voulez le formater mais qu'il devient statique, placez-le dans la bonne position J'ai un fichier de bibliothèque partagé (* .sa pour a.out, * .so pour ELF) Vérifiez s'ils sont lisibles.

En d'autres termes, il n'est pas bon de saupoudrer des liens statiques pour que tout soit indépendant de l'environnement. (Autrement dit, mes pensées étaient superficielles.)

Postscript

Lors de l'utilisation de pyinstaller pour générer un dossier au lieu d'un fichier

cannot find libexpat.so

J'obtenais une erreur comme celle-ci. Cela dit que lors de l'utilisation de libpython3.6m.so, `` libexpat.so devait également être lié dynamiquement, donc il n'est pas sur le conteneur docker à ce moment-là C'était une erreur.

J'y ai pensé, mais la solution rapide est Il s'agissait d'installer ce `libexpat.so``` normalement avec` `ʻapt-get install libexpat-dev `sur le conteneur.

Résumé

Lorsque vous utilisez ** pyinstaller ** sous Linux, gardez à l'esprit qu'il existe des bibliothèques qui sont liées dynamiquement même après qu'elles ne deviennent qu'un seul fichier. Si vous vous fâchez au moment de l'exécution avec un problème de lien

c'est tout.

Cette fois par ici.

fin.

Recommended Posts

Trébucher sur un lien dynamique lors de l'exécution d'un binaire dans Pyinstaller (Linux) Résolu
Le jour où le serveur Flask fonctionnant sous Linux sur AWS était semi-persistant (fonctionnant en arrière-plan)
Éliminez l'entrée de mot de passe lors de l'exécution de sudo ~~ sur les PC Linux!
Résolution d'une erreur lors de la mise en place de pygame dans python3 sur raspberry pi