Vous pouvez créer une application MacOS à l'aide du script python créé à l'aide de pyinstaller.
Au début, j'ai utilisé py2app, mais la taille du fichier de résultat était différente comme ci-dessous.
pip install pyinstaller
C'est tout
Il est recommandé de conduire le pyinstaller via le fichier * .spec.
La structure de base du fichier de spécifications est la suivante.
# -*- 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')
Dans ce cas, lisez main.py et créez Main.app. l'icône porte mainIcon.ico.
Main.py existe dans "/ Users / ... / ProgramNameDir" et fait référence au fichier lib de "./lib" en dessous. Donc, modifiez-le un peu pour que le fichier * .spec reconnaisse "./lib".
# -*- mode: python -*-
# filename = Main.spec
###personnel./Code pour reconnaître les bibliothèques###
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')
Il y a un autre problème. Main.py utilise le fichier image dans / Users / ... / ProgramNameDir / img. Cela ne peut pas être lu par l'application finale même si elle est ajoutée dans sys.path.append. En effet, le mécanisme de gestion des fichiers image est différent.
Lorsque l'application créée par pyinstaller est pilotée, les fichiers nécessaires (fichiers image, etc.) sont copiés dans le dossier temporaire (dossier temporaire) à l'emplacement "_MEIPASS". Par conséquent, il est nécessaire de reconnaître "_MEIPASS" dans le code * .py.
Ajoutez cette fonction dans Main.py.
def resource_path(relative):
if hasattr(sys, "_MEIPASS"):
return os.path.join(sys._MEIPASS, relative)
return os.path.join(relative)
Ensuite, convertissez l'enfant de référence d'image dans le code. exemple:
"./img/Title.png " --> resource_path("./img/Title.png ")
Ajoutez Tree () au fichier * .spec.
#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'), #<--Nom du dossier avec l'image à ajouter 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')
J'utilise un MacBook pro. Autrement dit, j'utilise Retina Display. Si vous créez une application avec pyinstaller telle quelle, les boîtes de message et les boîtes de dialogue apparaîtront floues sur l'écran Retina, ce qui est moche.
Ajoutez info_plist à BUNDLE pour le résoudre.
#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')
C'est à peu près la fin.
#### **`pyinstaller Main.spec`**
```spec
Vous pouvez créer une application avec.
Dans le cas de py2exe ou py2app, il y a beaucoup de cas, mais dans le cas de pyinstaller, il n'y en a pas beaucoup, donc je l'ai enregistré pour l'organisation.
Recommended Posts