Sie können eine MacOS-Anwendung mithilfe des mit pyinstaller erstellten Python-Skripts erstellen.
Zuerst habe ich py2app verwendet, aber die Größe der Ergebnisdatei war anders als unten. --Py2app Ergebnis: 35MB --Pyinstaller-Ergebnis: 25 MB Es gibt keinen Grund, Pyinstaller nicht zu verwenden. Die Installation ist jetzt mit PIP möglich. (Ich konnte es letztes Jahr nicht tun)
pip install pyinstaller
Das ist es
Es wird empfohlen, den Pyinstaller durch die * .spec-Datei zu fahren.
Die Grundstruktur der Spezifikationsdatei ist wie folgt.
# -*- mode: python -*-
# filename = Main.spec
a = Analysis(['Main.py'],
pathex=['/Users/.../ProgramNameDir'],
hiddenimports=[],
hookspath=None,
runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='Main',
debug=False,
strip=None,
upx=True,
console=False , icon='mainIcon.ico')
app = BUNDLE(exe,
name='Main.app',
icon='mainIcon.ico')
Lesen Sie in diesem Fall main.py und erstellen Sie Main.app. Symbol trägt mainIcon.ico.
Main.py existiert in "/ Users / ... / ProgramNameDir" und verweist auf die lib-Datei von "./lib" darunter. Ändern Sie es daher ein wenig, damit die * .spec-Datei "./lib" erkennt.
# -*- mode: python -*-
# filename = Main.spec
###persönlich./Code zum Erkennen von Bibliotheken###
import sys
myLibPath = './libs'
sys.path.append(myLibPath)
############################
a = Analysis(['Main.py'],
pathex=['/Users/.../ProgramNameDir'],
hiddenimports=[],
hookspath=None,
runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='Main',
debug=False,
strip=None,
upx=True,
console=False , icon='mainIcon.ico')
app = BUNDLE(exe,
name='Main.app',
icon='mainIcon.ico')
Es gibt noch ein anderes Problem. Main.py verwendet die Bilddatei in / Users / ... / ProgramNameDir / img. Dies kann von der endgültigen App nicht gelesen werden, selbst wenn es in sys.path.append hinzugefügt wird. Dies liegt daran, dass der Mechanismus für den Umgang mit Bilddateien unterschiedlich ist.
Wenn die von pyinstaller erstellte App gesteuert wird, werden die erforderlichen Dateien (Bilddateien usw.) in den temporären Ordner (temporärer Ordner) am Speicherort "_MEIPASS" kopiert. Daher muss "_MEIPASS" im * .py-Code erkannt werden.
Fügen Sie diese Funktion in Main.py hinzu.
def resource_path(relative):
if hasattr(sys, "_MEIPASS"):
return os.path.join(sys._MEIPASS, relative)
return os.path.join(relative)
Konvertieren Sie dann das untergeordnete Bildreferenzelement in den Code. Beispiel:
"./img/Title.png " --> resource_path("./img/Title.png ")
Fügen Sie Tree () zur * .spec-Datei hinzu.
#filename = Main.spec import sys myLibPath = './libs' sys.path.append(myLibPath) a = Analysis(['Main.py'], pathex=['/Users/.../ProgramNameDir'], hiddenimports=[], hookspath=None, runtime_hooks=None) pyz = PYZ(a.pure) exe = EXE(pyz, Tree('img',prefix='img'), #<--Ordnername mit dem hinzuzufügenden Bild a.scripts, a.binaries, a.zipfiles, a.datas, name='Main', debug=False, strip=None, upx=True, console=False , icon='mainIcon.ico') app = BUNDLE(exe, name='Main.app', icon='mainIcon.ico')
Ich benutze ein MacBook Pro. Das heißt, ich verwende Retina Display. Wenn Sie eine App erstellen, die mit Pyinstaller erstellt wurde, werden Meldungsfelder und Dialoge auf dem Retina-Display unscharf angezeigt, was hässlich ist.
Fügen Sie info_plist zu BUNDLE hinzu, um das Problem zu lösen.
#filename = Main.spec import sys myLibPath = './libs' sys.path.append(myLibPath) a = Analysis(['Main.py'], pathex=['/Users/.../ProgramNameDir'], hiddenimports=[], hookspath=None, runtime_hooks=None) pyz = PYZ(a.pure) exe = EXE(pyz, Tree('img',prefix='img'), a.scripts, a.binaries, a.zipfiles, a.datas, name='Main', debug=False, strip=None, upx=True, console=False , icon='mainIcon.ico') app = BUNDLE(exe, name='Main.app', info_plist={ 'NSHighResolutionCapable': 'True'}, #<-- Option for High Resolution icon='mainIcon.ico')
Dies ist ungefähr das Ende.
#### **`pyinstaller Main.spec`**
```spec
Sie können eine App mit erstellen.
Im Fall von py2exe oder py2app gibt es viele Fälle, aber im Fall von pyinstaller gibt es nicht so viele, deshalb habe ich es für die Organisation aufgezeichnet.
Recommended Posts