Enregistrer lorsqu'un fichier exécutable est généré à partir de code Python à l'aide de pyinstaller sur Mac (OSError: bibliothèque Python introuvable: évitez libpython3.7m.dylib, .Python, libpython3.7.dylib)

Contenu de l'article

Il s'agit d'un enregistrement de la génération d'un fichier exécutable à partir de code Python à l'aide de pyinstaller sur un Mac.

Code Python

print_sys_path.py



import sys

print(sys.path)
print(f"__name__ = {__name__}")
print(f"__file__ = {__file__}")

exécution de pyinstaller et message d'erreur

En utilisant le pyinstaller installé avec pip, j'ai exécuté ce qui suit sur mon terminal:


pyinstaller print_sys_path.py --onefile

J'ai une erreur de bibliothèque Python non trouvée comme ci-dessous.


71 INFO: PyInstaller: 3.6
71 INFO: Python: 3.7.4
83 INFO: Platform: Darwin-19.2.0-x86_64-i386-64bit

(Omis)

OSError: Python library not found: libpython3.7m.dylib, .Python, libpython3.7.dylib, Python
    This would mean your Python installation doesn't come with proper library files.
    This usually happens by missing development package, or unsuitable build parameters of Python installation.

    * On Debian/Ubuntu, you would need to install Python development packages
      * apt-get install python3-dev
      * apt-get install python-dev
    * If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)

Action 1 (échec dans le premier --enable-shared)

Utilisez "--enable-shared" comme option lors de l'installation de Python avec pyenv. J'ai fait ce qui suit sur mon terminal:


PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.4

Ce qui suit est affiché et 3.7.4 a été écrasé.


pyenv: /Users/username/.pyenv/versions/3.7.4 already exists
continue with installation? (y/N) y
python-build: use [email protected] from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.4.tar.xz...
-> https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
Installing Python-3.7.4...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.7.4 to /Users/username/.pyenv/versions/3.7.4

Vérifiez le Python utilisé.


$ pyenv global
3.7.4

Quand j'ai commencé pyinstaller, j'ai toujours eu l'erreur de bibliothèque Python non trouvée comme ci-dessous.


$ pyinstaller print_sys_path.py --onefile

(Omis)

OSError: Python library not found: Python, libpython3.7.dylib, .Python, libpython3.7m.dylib
    This would mean your Python installation doesn't come with proper library files.
    This usually happens by missing development package, or unsuitable build parameters of Python installation.

    * On Debian/Ubuntu, you would need to install Python development packages
      * apt-get install python3-dev
      * apt-get install python-dev
    * If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)

J'ai été grondé que le fichier .dylib ne pouvait pas être trouvé, alors utilisez la commande find pour trouver l'emplacement comme indiqué ci-dessous.


find $HOME -name 'libpython3*.dylib' 2> /dev/null

J'ai spécifié l'emplacement de libpython3.7m.dylib dans la variable d'environnement LD_LIBRARY_PATH et l'ai exécuté, mais l'erreur de bibliothèque Python introuvable est restée comme indiqué ci-dessous.


$ LD_LIBRARY_PATH=/Users/username/.pyenv/versions/3.7.4/lib pyinstaller print_sys_path.py --onefile

(Omis)

OSError: Python library not found: .Python, Python, libpython3.7m.dylib, libpython3.7.dylib
    This would mean your Python installation doesn't come with proper library files.
    This usually happens by missing development package, or unsuitable build parameters of Python installation.

    * On Debian/Ubuntu, you would need to install Python development packages
      * apt-get install python3-dev
      * apt-get install python-dev
    * If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)

Contre-mesure 2 (réussie avec --enable-framework)

Utilisez "--enable-framework" comme option lors de l'installation de Python avec pyenv. J'ai fait ce qui suit sur mon terminal:

PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.7.4

Ce qui suit est affiché et 3.7.4 a été écrasé.

pyenv: /Users/username/.pyenv/versions/3.7.4 already exists
continue with installation? (y/N) Y
python-build: use [email protected] from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.4.tar.xz...
-> https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
Installing Python-3.7.4...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.7.4 to /Users/username/.pyenv/versions/3.7.4

Quand j'ai démarré pyinstaller, j'ai eu l'erreur suivante "pyinstaller is missing".


$ LD_LIBRARY_PATH=/Users/username/.pyenv/versions/3.7.4/lib pyinstaller print_sys_path.py --onefile
-bash: /Users/username/.pyenv/shims/pyinstaller: No such file or directory

Quand j'ai essayé de réinstaller pyinstaller, on m'a dit que c'était "déjà" comme indiqué ci-dessous.


$ pip install pyinstaller
Requirement already satisfied: pyinstaller in /Users/username/.pyenv/versions/3.7.4/lib/python3.7/site-packages (3.6)
Requirement already satisfied: altgraph in /Users/username/.pyenv/versions/3.7.4/lib/python3.7/site-packages (from pyinstaller) (0.17)
Requirement already satisfied: setuptools in /Users/username/.pyenv/versions/3.7.4/Python.framework/Versions/3.7/lib/python3.7/site-packages (from pyinstaller) (40.8.0)
Requirement already satisfied: macholib>=1.8 in /Users/username/.pyenv/versions/3.7.4/lib/python3.7/site-packages (from pyinstaller) (1.14)

Je ne comprends pas pourquoi! À la suite d'essais et d'erreurs, j'ai pu réinstaller pyinstaller en suivant les étapes ci-dessous: Désinstaller → Installer.


$ pip uninstall pyinstaller
Uninstalling PyInstaller-3.6:
  Would remove:
    /Users/username/.pyenv/versions/3.7.4/lib/python3.7/site-packages/PyInstaller-3.6.dist-info/*
    /Users/username/.pyenv/versions/3.7.4/lib/python3.7/site-packages/PyInstaller/*
Proceed (y/n)? Y
  Successfully uninstalled PyInstaller-3.6

$ pip install pyinstaller
Processing /Users/username/Library/Caches/pip/wheels/62/fe/62/4c0f196d1e0dd689e097449bc81d7d585a7de7dd86b081b80b/PyInstaller-3.6-cp37-none-any.whl
Requirement already satisfied: setuptools in /Users/username/.pyenv/versions/3.7.4/Python.framework/Versions/3.7/lib/python3.7/site-packages (from pyinstaller) (40.8.0)
Requirement already satisfied: macholib>=1.8 in /Users/username/.pyenv/versions/3.7.4/lib/python3.7/site-packages (from pyinstaller) (1.14)
Requirement already satisfied: altgraph in /Users/username/.pyenv/versions/3.7.4/lib/python3.7/site-packages (from pyinstaller) (0.17)
Installing collected packages: pyinstaller
Successfully installed pyinstaller-3.6

Lorsque j'ai redémarré pyinstaller comme indiqué ci-dessous, un fichier exécutable a été généré sous le répertoire dist. J'ai spécifié LD_LIBRARY_PATH, mais cela semble fonctionner même si je ne le spécifie pas.


LD_LIBRARY_PATH=/Users/username/.pyenv/versions/3.7.4/lib pyinstaller print_sys_path.py --onefile

Lancement de l'exécutable généré (réussi).


dist/print_sys_path 
['/var/folders/kc/blch89657dv8zrzlxjljz6f40000gr/T/_MEInZMCQo/base_library.zip', '/var/folders/kc/blch89657dv8zrzlxjljz6f40000gr/T/_MEInZMCQo']
__name__ = __main__
__file__ = print_sys_path.py

Action 3 (réussie dans la seconde --enable-shared)

Le premier --enable-shared a échoué, mais quand je l'ai réinstallé avec --enable-shared, il a réussi, donc je l'enregistre.

Installation de Python avec pyenv:


$ PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.4
pyenv: /Users/username/.pyenv/versions/3.7.4 already exists
continue with installation? (y/N) y
python-build: use [email protected] from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.4.tar.xz...
-> https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
Installing Python-3.7.4...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.7.4 to /Users/username/.pyenv/versions/3.7.4

Démarrez pyinstaller:


pyinstaller print_sys_path.py --onefile

Lancez l'exécutable généré:


$ dist/print_sys_path 
['/var/folders/kc/blch89657dv8zrzlxjljz6f40000gr/T/_MEIf6CW7m/base_library.zip', '/var/folders/kc/blch89657dv8zrzlxjljz6f40000gr/T/_MEIf6CW7m']
__name__ = __main__
__file__ = print_sys_path.py

Essayez-le avec pipenv. Démarrez pyinstaller:


pipenv run pyinstaller print_sys_path.py --onefile

Lancez l'exécutable généré:


$ dist/print_sys_path 
['/var/folders/kc/blch89657dv8zrzlxjljz6f40000gr/T/_MEIPYS34b/base_library.zip', '/var/folders/kc/blch89657dv8zrzlxjljz6f40000gr/T/_MEIPYS34b']
__name__ = __main__
__file__ = print_sys_path.py

Raison pour laquelle cela n'a pas fonctionné dans la première solution

Probablement, si Python est écrasé par pyenv, celui installé avec pip doit également être réinstallé (désinstaller → installer). Solution 1 J'ai écrasé Python et l'ai installé, mais pyinstaller a utilisé celui qui était inclus auparavant, donc je pense que la même erreur s'est produite.

Recommended Posts

Enregistrer lorsqu'un fichier exécutable est généré à partir de code Python à l'aide de pyinstaller sur Mac (OSError: bibliothèque Python introuvable: évitez libpython3.7m.dylib, .Python, libpython3.7.dylib)
Comparaison des bibliothèques de conversion de fichiers exécutables python (py2exe, cx_freeze, pyinstaller)
Créez un fichier image à l'aide de PIL (Python Imaging Library).
Lire le code QR à partir du fichier image avec Python (Mac)
Notes minimales lors de l'utilisation de Python sur Mac (édition pyenv)
Notes minimales lors de l'utilisation de Python sur Mac (édition Homebrew)