1

我为 Mac 制作了一个 wxPython 应用程序,并用 py2app 打包它。两个人已经说他们无法启动它,并显示以下错误消息:

ImportError: dlopen(/Users/username/Desktop/MCManager.app/Contents/Resources/lib/python2.6/wx/_core_.so, 2): Library not loaded: /usr/lib/libwx_macud-2.8.0.dylib
  Referenced from: /Users/username/Desktop/MCManager.app/Contents/Resources/lib/python2.6/wx/_core_.so
  Reason: image not found

我只能在 Mac 10.6.7 上测试该应用程序。遇到问题的两个人都在使用 10.7.x。有没有其他人遇到过这个问题,或者知道这意味着什么?从消息看来,它试图加载 wx 库不成功,但是 wx 库应该在应用程序的 Resources 文件夹中,对吗?

这是我的设置文件:

#! /usr/bin/env python

import py2app
from setuptools import setup

setup(
    options = dict(
        py2app = dict(
            iconfile = 'MCManager.icns',
            packages = 'wx',
            site_packages = True,
            plist = dict(
                CFBundleName = "MCManager",
                CFBundleShortVersionString = "1.2.2",
                CFBundleGetInfoString = "MCManager 1.2.2",
                CFBundleExecutable = "MCManager",
                CFBundleIdentifier = "net.sourceforge.mcmanager",
            ),
        ),
    ),
    app = ['ScriptUnix.py']
)

我用 , 运行它arch -i386 python26 filename.py py2apparch因为没有 和 2.6 就无法让 Python 运行 32 位arch,因为长话短说,我不能将 2.7 与 py2app 一起使用)。

4

1 回答 1

2

问题是您正在构建一个半独立的应用程序。正如文档在各个地方所解释的那样,如果您使用的是“供应商 Python”,这意味着预装 OS X 的任何 Python 版本py2app都无法构建独立的应用程序。例如:

如果使用 --semi-standalone 选项或供应商 Python,则忽略 Python.framework。所有其他供应商文件(/usr/ 或 /System/ 中的那些,不包括 /usr/local/)也被排除在外。

因此,它不会将wx库打包在 中/usr/lib,因为这些是供应商库。相反,它只是链接到现有的。标准 OS X 10.7 系统上没有这样的库。即使有,您最终从 10.6 显式链接到 2.8.0 版本的事实意味着它可能无法在以后的系统上运行。

您需要做的是将这些wx库复制到您的.app包中,并从那里引用它们。如果py2app您使用供应商 Python 运行它,则不会为您执行此操作。这意味着您有三个选择:

  1. 使用单独的 Python 安装。
  2. 无论如何,都可以通过破解源来欺骗py2app构建独立的应用程序py2app
  3. 自己捆绑应用程序(或使用其他工具)。

最佳答案通常是#1。在您的评论中,您说您能够安装 Python 2.7.3(可能来自 python.org?),并且您能够安装py2app供应商 2.6,但您无法安装py2app自定义 2.7。 3. 这听起来非常难以置信。(如果您能够以某种方式安装 2.7.3,则应该将其安装到您有权访问的目录中。)但是,即使它是真的,也没关系;您可以将 Python 包安装到主目录下的用户特定的站点包目录中。您不需要管理员权限。事实上,大多数 Unix 软件都是按照这种方式设计的。

一个更简单的方法是使用virtualenv。是的,我知道,您无法安装它,但您不必安装。如果您阅读文档,甚至还有一整套关于如何在无法安装任何东西的系统上引导 virtualenv 的说明。结果是您自己的个人 Python 安装,基于系统 2.7.3,但您可以完全控制。所以你可以py2app在那里安装。(有一些关于使用py2appvirtualenv一起使用的注意事项,您应该在py2app文档中阅读。)

如果你不能或不会做任何这些事情,那么py2app就不能做你想做的事,至少不能开箱即用。但它是开源的。源代码中甚至有注释解释了为什么它不尝试从系统 Python 进行独立构建。而且大多数真正棘手的东西都被分成单独的包(例如macholiband altgraph),因此您应该能够理解py2app自己,足以将适用于您的特定应用程序的独立包组合在一起。(这比修改p2app以完全通用的方式解决潜在问题要容易得多。)

或者您可以查看其他与 py2app 执行类似操作的工具。尝试在 PyPI 中搜索py2appfreeze看看会发生什么。您通常可以将软件包安装到您的主目录中,或者在不安装它们的情况下运行它们,所以开始尝试任何看起来有希望的东西,看看它是否能解决您的问题。

于 2012-12-05T21:47:33.157 回答