我在Mac OS Sierra上使用python 3.6.2与pyenv和homebrew,我无法使用py2app v0.14和pyinstaller v3.2.1创建功能包应用程序。
安装了ActiveTcl版本8.5.18 / tkinter。
标准2.7.10 Mac版的python没有做太多其他事情。我实际上设法做了一两次尝试与其他程序一起使用python 2.7.10,但由于我想使用3.6.2,所以没有必要保持标准。
py2app创建一个只提供“错误”的.app文件,Mac要求终止。 pyinstaller甚至没有创建.app文件。我按照所有程序中的所有说明进行操作。
py2app在创建.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)
我检查了缺少的模块,对我而言,程序似乎不是试图使用上面列出的任何模块。
我从互联网上检索了程序,这是一个简单的测试程序,这是脚本:
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()
我已经尝试卸载并重新安装python,ActiveTcl,我已经运行了brew医生,似乎没什么用。 Pyenv工作正常。 Homebrew工作正常。
我在各处搜索了两天,无论我每次py2app创建.app文件时我都会这样做,它只给出“错误”。
当我通过IDLE运行时,应用程序运行完美。它有什么问题?
编辑:经过一段时间的努力,我找到了一个使用cx_freeze的python 3.6.2的解决方案。正如我之前所说,Py2app仅适用于Python 2.7.10。出于某种原因Py2app只加载我在前面提到的python 2.7.10运行时丢失的模块,当python 3.6.2进来时他无法加载模块而.app文件无法正常工作。
答案 0 :(得分:0)
在我自己的&#39; pyjinks&#39;之后使用py2app我发现了一些可能相关的东西。
首先,您的问题是&#39;错误&#39;听起来像我的app文件同步(通过Dropbox样式服务)到另一台计算机时遇到的问题。该文件可以在创建它的计算机上正常运行,但是当我尝试在远程计算机上运行它时,我会收到一个错误,它无法打开。但是,如果我通过谷歌驱动器上传应用程序文件,然后将其下载到远程计算机,它将打开并运行良好!所以,经过四处寻找后,我发现这台远程计算机上的应用程序包内的python脚本没有执行权限。运行&#39; chmod 775 myapp.py&#39;在脚本上,MacOs会打开它。
我使用pydub和ffmpeg的应用程序遇到了这个问题,这与pydub使用subprocess运行ffmpeg的事实有关。如果ffmpeg在你的系统路径中,那么pydub会发现它没问题,但是如果你用py2app打包你的应用程序,那么它是一个不同的故事,因为应用程序中的ffmpeg赢了在[另一台计算机]的系统路径中。我最终在我的python应用程序中使用这一行来定义ffmpeg的位置:btw,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 Framework添加到bundle中。但是,我发现包含的名为ffmpeg的文件并不具有执行权限。在每次创建py2app之后,我必须“完成775 ffmpeg&#39;在应用程序内容的内部&#39; bungle&#39;为了让应用程序运行ffmpeg 我不确定py2app是否有特殊规则允许它创建具有执行权限的文件,但它并没有自动执行。
在对此类问题进行故障排除时,可能很难获得有关哪里出错的信息。所以我寻找额外的技术来找出问题所在。在对py2app问题进行故障排除以使用大量尝试时,这可能是一个好主意,因此您不会错过任何例外情况:
try:
from tkinter import *
except Exception as e:
print("tkinter didn't import: {}".format(e))