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

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

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

当我进入构建文件夹并使用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]
)

解决方法:

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

上一篇:entrytools entry_points / console_scripts在shebang中有特定的Python版本


下一篇:Python:`dist`和`sdist`之间有性能差异吗?