为什么py2app .app比同一个python程序需要更长的时间才能启动?

时间:2013-01-17 19:15:48

标签: python c macos setuptools py2app

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

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

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

我想也许这与打开试图找到文件或其他东西有关,所以我尝试了这个:

open -a testrun.app ""

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

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

更多细节 -

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

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

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

我写了一个非常简单的python程序,它调用了c函数。我编写了一个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]
)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

设置" argv_emulation"除非您确实需要该功能(即,除非您希望能够删除应用程序包上的文件,然后将这些文件名作为sys.argv中的参数),否则为False。

" Argv_emulation"是一个hack,用于将请求打开文件的AppleEvents转换为sys.argv中的额外参数。为此,仿真代码会旋转事件循环并等待这些打开事件或超时。你可能会遇到那个超时。