Aufzeichnen, wann eine ausführbare Datei aus Python-Code mit pyinstaller auf einem Mac generiert wird (OSError: Python-Bibliothek nicht gefunden: Vermeiden Sie libpython3.7m.dylib, .Python, libpython3.7.dylib)

Artikelinhalt

Dies ist eine Aufzeichnung zum Generieren einer ausführbaren Datei aus Python-Code mit pyinstaller auf einem Mac.

Python-Code

print_sys_path.py



import sys

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

Pyinstaller-Ausführung und Fehlermeldung

Mit dem mit pip installierten Pyinstaller habe ich Folgendes auf meinem Terminal ausgeführt:


pyinstaller print_sys_path.py --onefile

Ich habe eine Python-Bibliothek nicht gefunden Fehler wie unten.


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

(Weggelassen)

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)

Aktion 1 (Fehler beim ersten --enable-shared)

Verwenden Sie "--enable-shared" als Option, wenn Sie Python mit pyenv installieren. Ich habe auf meinem Terminal Folgendes getan:


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

Folgendes wird angezeigt und 3.7.4 wurde überschrieben.


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

Überprüfen Sie den verwendeten Python.


$ pyenv global
3.7.4

Als ich pyinstaller startete, bekam ich immer noch die Python-Bibliothek nicht gefunden Fehler wie unten.


$ pyinstaller print_sys_path.py --onefile

(Weggelassen)

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)

Ich wurde beschimpft, dass die .dylib-Datei nicht gefunden werden konnte. Verwenden Sie daher den Befehl find, um den Speicherort wie unten gezeigt zu finden.


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

Ich habe den Speicherort von libpython3.7m.dylib in der Umgebungsvariablen LD_LIBRARY_PATH angegeben und ausgeführt, aber der Fehler "Python-Bibliothek nicht gefunden" blieb wie unten gezeigt.


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

(Weggelassen)

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)

Gegenmaßnahme 2 (erfolgreich mit --enable-Framework)

Verwenden Sie "--enable-framework" als Option, wenn Sie Python mit pyenv installieren. Ich habe auf meinem Terminal Folgendes getan:

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

Folgendes wird angezeigt und 3.7.4 wurde überschrieben.

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

Als ich pyinstaller startete, bekam ich die folgende Fehlermeldung "pyinstaller fehlt".


$ 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

Als ich versuchte, pyinstaller neu zu installieren, wurde mir gesagt, dass es "bereits" war, wie unten gezeigt.


$ 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)

Ich verstehe nicht warum! Aufgrund von Versuch und Irrtum konnte ich pyinstaller neu installieren, indem ich die folgenden Schritte ausführte: Deinstallieren → Installieren.


$ 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

Als ich pyinstaller wie unten gezeigt erneut startete, wurde eine ausführbare Datei im Verzeichnis dist generiert. Ich habe LD_LIBRARY_PATH angegeben, aber es scheint zu funktionieren, auch wenn ich es nicht angegeben habe.


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

Startete die generierte ausführbare Datei (erfolgreich).


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

Aktion 3 (erfolgreich in der zweiten --enable-shared)

Das erste --enable-shared ist fehlgeschlagen, aber als ich es erneut mit --enable-shared installiert habe, war es erfolgreich, also werde ich es aufzeichnen.

Python mit pyenv installieren:


$ 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

Starten Sie pyinstaller:


pyinstaller print_sys_path.py --onefile

Starten Sie die generierte ausführbare Datei:


$ 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

Probieren Sie es mit pipenv. Starten Sie pyinstaller:


pipenv run pyinstaller print_sys_path.py --onefile

Starten Sie die generierte ausführbare Datei:


$ 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

Grund, warum es in der ersten Lösung nicht gut funktioniert hat

Wenn Python mit pyenv überschrieben wird, muss wahrscheinlich auch das mit pip installierte neu installiert werden (deinstallieren → installieren). Lösung 1 Ich habe Python überschrieben und installiert, aber pyinstaller hat das zuvor enthaltene verwendet, sodass ich denke, dass der gleiche Fehler aufgetreten ist.

Recommended Posts

Aufzeichnen, wann eine ausführbare Datei aus Python-Code mit pyinstaller auf einem Mac generiert wird (OSError: Python-Bibliothek nicht gefunden: Vermeiden Sie libpython3.7m.dylib, .Python, libpython3.7.dylib)
Vergleich der ausführbaren Python-Dateikonvertierungsbibliothek (py2exe, cx_freeze, pyinstaller)
Erstellen Sie eine Bilddatei mit PIL (Python Imaging Library).
Lesen Sie den QR-Code aus der Bilddatei mit Python (Mac).
Mindestnotizen bei Verwendung von Python auf Mac (pyenv edition)
Mindestnotizen bei Verwendung von Python auf Mac (Homebrew Edition)