2017-08-29 2 views
0

et pyinstaller v3.2.1.Impossible de créer un ensemble d'applications fonctionnelles sur Sierra en utilisant py2app et python 3.6.2

ActiveTcl version 8.5.18/tkinter sont installés.

Standard 2.7.10 La version Mac de python ne fait pas grand chose d'autre. J'ai effectivement réussi à faire une ou deux tentatives de travailler sur python 2.7.10 avec d'autres programmes, mais comme je veux utiliser 3.6.2, il n'y a pas de raison de rester sur la norme. Py2app crée un fichier .app qui donne simplement "erreur" et Mac demande à se terminer. pyinstaller ne crée même pas de fichier .app. J'ai suivi toutes les instructions dans tous les programmes.

py2app me donne ce message à la fin lors de la création du .app:

Modules not found (unconditional imports): 

* com (com.sun.jna) 
* com.jna (com.sun) 
* com.sun (com.sun.jna.platform) 
* ordereddict (pkg_resources._vendor.pyparsing) 
* win32com (win32com) 
* win32com.shell (win32com.shell) 
* win32com.shellcon (win32com.shell) 

Modules not found (conditional imports): 

* StringIO (pkg_resources._vendor.six) 
* com (pkg_resources._vendor.appdirs) 
* com.sun.jna (pkg_resources._vendor.appdirs) 
* com.sun.jna.platform (pkg_resources._vendor.appdirs) 
* win32com (pkg_resources._vendor.appdirs) 
* win32com.shell (pkg_resources._vendor.appdirs) 

J'ai vérifié pour les modules manquants et pour moi, il ne ressemble pas à le programme tente d'utiliser tous les modules énumérés ci-dessus.

Je récupérai le programme de l'Internet, il est un programme de test simple, voici le script:

from tkinter import * 
from tkinter import ttk 

def calculate(*args): 
    try: 
     value = float(feet.get()) 
     meters.set((0.3048 * value * 10000.0 + 0.5)/10000.0) 
    except ValueError: 
     pass 

root = Tk() 
root.title("Feet to Meters") 

mainframe = ttk.Frame(root, padding="3 3 12 12") 
mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
mainframe.columnconfigure(0, weight=1) 
mainframe.rowconfigure(0, weight=1) 

feet = StringVar() 
meters = StringVar() 

feet_entry = ttk.Entry(mainframe, width=7, textvariable=feet) 
feet_entry.grid(column=2, row=1, sticky=(W, E)) 

ttk.Label(mainframe, textvariable=meters).grid(column=2, row=2, sticky=(W, E)) 
ttk.Button(mainframe, text="Calculate", command=calculate).grid(column=3, row=3, sticky=W) 

ttk.Label(mainframe, text="feet").grid(column=3, row=1, sticky=W) 
ttk.Label(mainframe, text="is equivalent to").grid(column=1, row=2, sticky=E) 
ttk.Label(mainframe, text="meters").grid(column=3, row=2, sticky=W) 

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5) 

feet_entry.focus() 
root.bind('<Return>', calculate) 

root.mainloop() 

J'ai essayé de désinstaller et de réinstaller python, ActiveTcl, je suis à court médecin de bière, rien ne semble travail. Pyenv fonctionne bien. Homebrew fonctionne bien.

J'ai cherché partout pendant deux jours, et peu importe ce que je fais chaque fois que py2app crée le fichier .app, il donne seulement "Erreur".

L'application fonctionne parfaitement lorsque je cours à travers IDLE. Quel problème peut-il être ??? Après quelque temps, j'ai trouvé une solution pour python 3.6.2 en utilisant cx_freeze. Py2app a seulement travaillé avec Python 2.7.10 comme je l'ai déjà dit. Pour une raison quelconque, Py2app ne charge que les modules manquants mentionnés plus haut lors de l'exécution de python 2.7.10, quand python 3.6.2 arrive, il ne parvient pas à charger les modules et le fichier .app ne fonctionne pas correctement.

Répondre

0

Après mes propres 'pyjinks' avec py2app, j'ai trouvé quelques petites choses qui pourraient être en rapport. Tout d'abord, votre problème avec 'error' ressemble à un problème que j'ai rencontré lorsque mon fichier d'application a été synchronisé (via un service de type dropbox) sur un autre ordinateur. Le fichier fonctionnerait bien sur l'ordinateur qui l'a créé mais j'obtiendrais une erreur qu'il ne pourrait pas être ouvert quand j'ai essayé de l'exécuter sur l'ordinateur distant. MAIS, si j'ai téléchargé le fichier de l'application via google drive, puis téléchargé sur l'ordinateur distant, il serait ouvert et fonctionne bien !! Donc, après avoir piquer autour, j'ai trouvé que le script python à l'intérieur de l'ensemble de l'application sur cet ordinateur distant n'a pas les autorisations d'exécution. Après avoir exécuté 'chmod 775 myapp.py' sur le script, MacOs l'ouvrira.

J'ai couru à travers ce même gotcha avec une application utilisant pydub et ffmpeg qui avait à voir avec le fait que pydub utilise des sous-processus pour lancer ffmpeg. Si ffmpeg est dans le chemin de votre système alors pydub le trouve correct mais si vous empaquetez votre application avec py2app, alors c'est une histoire différente parce que le ffmpeg qui vient dans l'application ne sera pas dans le chemin du système [de cet autre ordinateur] .Je fini par utiliser cette ligne dans mon application python pour définir où le ffmpeg est: BTW, AudioSegment est un module de pydub et l'attribut convertisseur il dit de chercher est l'outil de conversion de format à ce chemin spécifique:

AudioSegment.converter = "../Frameworks/ffmpeg" 

ensuite, je mets cela dans le fichier de configuration du py2app:

OPTIONS = { 
    'frameworks': ['/usr/local/Cellar/portaudio/19.6.0/lib/libportaudio.dylib', 
    '/usr/local/Cellar/ffmpeg/3.4/bin/ffmpeg'], } 

cela dit py2app ajouter le [portaudio et] cadre de ffmpeg au faisceau. MAIS, j'ai trouvé que le fichier nommé ffmpeg qui est inclus n'a pas les privilèges d'exécution hors de la porte. Après chaque création de py2app, je devais 'chmod 775 ffmpeg' dans le contenu de l'application 'bungle' afin de permettre à l'application d'exécuter ffmpeg.
Je ne suis pas sûr s'il existe des règles spéciales avec py2app qui lui permettent de créer des fichiers avec des permissions d'exécution mais il ne l'a pas fait automatiquement. Pendant le dépannage de ce genre de chose, il peut être difficile d'obtenir des informations sur ce qui ne va pas où. J'ai donc cherché des techniques supplémentaires pour trouver ce qui n'allait pas. Il serait peut-être une bonne idée lors de la résolution d'un problème de py2app d'utiliser beaucoup de son essai afin que vous ne manquez aucune exception:

try: 
    from tkinter import * 
except Exception as e: 
    print("tkinter didn't import: {}".format(e))