2017-08-29 56 views
0

我在python中使用python 3.6.2和Mac OS Sierra上的自制软件,并且我一直无法使用py2app v0.14创建功能包应用程序和pyinstaller v3.2.1。无法在Sierra上使用py2app和python创建功能应用程序包3.6.2

安装ActiveTcl版本8.5.18/tkinter。

标准2.7.10 python的Mac版本没有其他功能。我实际上设法做了一两次尝试与其他程序一起使用Python 2.7.10,但由于我想使用3.6.2,所以没有必要继续使用标准。

py2app创建一个.app文件,该文件只是给出“错误”,Mac要求终止。 pyinstaller甚至不创建一个.app文件。我遵循所有计划中的所有说明。创建的.app时

py2app给了我这个消息结尾:

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) 

我检查丢失模块,对我来说并不像程序正在尝试使用上面列出的任何模块。

我从互联网上检索到的节目,这是一个简单的测试程序,这里的脚本:

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

我已经试过卸载并重新安装蟒蛇,ActiveTcl,我已经运行BREW医生,似乎没有任何工作。 Pyenv工作正常。 Homebrew工作正常。

我到处搜索了两天,无论我每次做什么py2app创建.app文件,它只会给出“错误”。

当我运行IDLE时,该应用程序运行完美。什么问题可以?

编辑:经过一段时间的工作,我发现了python 3.6.2使用cx_freeze的解决方案。正如我之前所说,Py2app只能用于Python 2.7.10。出于某种原因,Py2app只在我使用Python 2.7.10运行时加载缺少的模块,当python 3.6.2进来时,他无法加载模块,并且.app文件无法正常工作。

回答

0

在我自己的'pyjinks'与py2app后,我发现了一些可能涉及的事情。

首先,您的'错误'问题听起来像是我的应用程序文件同步(通过Dropbox风格的服务)到另一台计算机时遇到的问题。该文件可以在创建它的计算机上正常运行,但是当我尝试在远程计算机上运行它时,会出现无法打开的错误。但是,如果我通过谷歌驱动器上传应用程序文件,然后将其下载到远程计算机,它会打开并运行良好!所以,在我发现后,我发现这个远程计算机上的应用程序包内的python脚本没有执行权限。在脚本上运行'chmod 775 myapp.py'后,MacOs会打开它。

我遇到了一个使用pydub和ffmpeg的应用程序,它与pydub使用子进程来运行ffmpeg有关。如果ffmpeg在你的系统路径中,那么pydub会发现它确定,但是如果你使用py2app打包你的应用程序,那么它是一个不同的故事,因为应用程序中的ffmpeg不会在[其他计算机]的系统路径中, 。最后我用这条线在我的Python应用程序,以确定其中的ffmpeg是:顺便说一句,AudioSegment是pydub的模块和转换器属性告诉它来寻找它在这个特定的路径格式转换工具:

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

然后我把这个在py2app安装文件:

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

这告诉py2app到[portaudio和] ffmpeg的框架添加到包。但是,我发现包含的名为ffmpeg的文件没有执行权限。在创建每个py2app之后,我必须在应用程序'bungle'的内容中'chmod 775 ffmpeg',以便允许应用程序运行ffmpeg。
我不确定py2app是否有特殊的规则,允许它创建具有执行权限的文件,但它不会自动执行。

在对这类事情进行故障诊断时,可能很难获取有关哪里出错的信息。所以我寻找额外的技术来找出发生了什么问题。在解决py2app问题时使用大量尝试可能是个好主意,因此您不会错过任何例外:

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