【问题标题】:Unable to create functional app bundle on Sierra using py2app and python 3.6.2无法使用 py2app 和 python 3.6.2 在 Sierra 上创建功能性应用程序包
【发布时间】:2017-08-29 04:48:27
【问题描述】:

我在 Mac OS Sierra 上使用带有 pyenv 和 homebrew 的 python 3.6.2,我无法使用 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 doctor,但似乎没有任何效果。 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 文件无法正常工作。

【问题讨论】:

    标签: python macos py2app pyenv


    【解决方案1】:

    在我自己使用 py2app 的“pyjinks”之后,我发现了一些可能相关的东西。

    首先,您的“错误”问题听起来像是我在将应用文件同步(通过保管箱样式服务)到另一台计算机时遇到的问题。该文件可以在创建它的计算机上正常运行,但是当我尝试在远程计算机上运行它时会出现无法打开的错误。但是,如果我通过谷歌驱动器上传应用程序文件,然后将其下载到远程计算机,它将打开并运行良好!因此,在四处寻找之后,我发现这台远程计算机上的应用程序包中的 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))
    

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多