4

我不确定我的问题/标题措辞是否正确。我正在开发 OSX 10.6 和 python 2.7.1。我使用 setuptools 和 py2app 创建了一个 .app,我可以从 finder 或终端使用 open 运行它。

我对该计划的目标之一是快速启动。

当我进入 build 文件夹并直接使用 python 运行 python 程序时,我的窗口立即弹出。在不到 1 秒的时间内。这是相当一致的。但是当我进入 dist 文件夹并运行 .app(从 finder 或打开)时,在窗口出现之前会有几秒钟的暂停。大约 4 到 5 秒,相当一致。

我想这可能与打开试图查找文档或其他东西有关,所以我尝试了这个:

open -a testrun.app ""

..果然,窗口立即弹出!

我需要在 setup.py 或某个地方做些什么来告诉它这不是面向文档的程序吗?

再详细一点——

我正在使用 Python 2.7.1(作为系统 python)在 OSX 10.6.8 上工作。我已经尝试了一些小的变化(2.6 with python_select,2.7.3 in a virtualenv..),但到目前为止,它没有任何区别。

我创建了一个简单的 .dylib(在 Objective-c 中),它导出了一个使用可可打开窗口的函数。我创建了一个非常简单的 python 扩展模块(在 c 中),其中有一个调用 .dylib 函数的函数。

(我的计划是为 gui 调用和相关的平台特定调用创建一个平台特定的共享/动态库,以及一个使用它的跨平台 c 库,然后创建高级语言扩展模块,使 c这些语言可用的库。)

我写了一个非常简单的调用 c 函数的 python 程序。我编写了一个 setup.py 来构建所有内容并使用 py2app 创建一个 .app。

这是 .dylib 的构建脚本:

gcc -framework Cocoa -dynamiclib -x objective-c testlib.objc -current_version 1.0 -compatibility_version 1.0 -o libTestlib.1.dylib -arch i386 -arch x86_64

这是 setup.py:

from setuptools import setup, Extension

APP = ['testrun.py']
DATA_FILES = []
OPTIONS = {
    'argv_emulation': True,
    'frameworks': ['/Users/shavais/scratch/objc/libTestlib.1.dylib']
}

module1 = Extension(
    'demo',
    sources = ['demo.c'],
    libraries = ['Testlib.1'],
    library_file_directories = ['/Users/shavais/scratch/objc']
)

setup(
    name = 'testrun',
    description = 'This is a testrun package',
    app = APP,
    data_files = DATA_FILES,
    options = {'py2app': OPTIONS},
    setup_requires = ['py2app'],
    version = '1.0',
    py_modules = ['testrun'],
    ext_modules = [module1]
)
4

2 回答 2

2

我不知道 Mac 上的 py2app(从未使用过),但如果它的工作方式类似于http://www.pyinstaller.org/,那么二进制文件必须将 python 运行时、您的程序和所有模块解压缩到内存中。这需要时间。

于 2013-01-18T18:35:13.530 回答
2

将“argv_emulation”设置为 False,除非您确实需要该功能(也就是说,除非您希望能够将文件拖放到应用程序包中,然后将这些文件名作为 sys.argv 中的参数)。

“Argv_emulation”是一种将请求打开文件的 AppleEvents 转换为 sys.argv 中的额外参数的 hack。为此,仿真代码会启动一个事件循环并等待那些打开的事件或超时。您可能会遇到该超时。

于 2013-02-20T09:07:13.910 回答