为什么使用py2app打包的.app程序比同样的Python程序启动时间更长?

4

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

我的程序目标之一是快速启动。

当我进入构建文件夹并直接使用python运行程序时,我的窗口立即弹出。 不到1秒的时间。 这相当稳定。 但是当我进入dist文件夹并运行.app文件(无论是从finder还是使用open),在窗口显示之前会有几秒钟的暂停。 大约4到5秒左右,相当稳定。

我认为可能与open命令试图查找文档或其他内容有关,所以我尝试了这个:

open -a testrun.app ""

果然,窗口立即弹出了!是否需要在setup.py或其他地方做些什么来告诉它这不是面向文档的程序呢?

再详细一点:

我正在使用OSX 10.6.8和Python 2.7.1(作为系统Python)。我尝试了一些微小的变化(使用python_select的2.6,虚拟环境中的2.7.3等),但到目前为止,都没有任何区别。

我创建了一个简单的.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个回答

2

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


2
将 "argv_emulation" 设置为 False,除非您实际上需要该功能(也就是说,除非您希望能够将文件拖放到应用程序包上,然后将这些文件名作为 sys.argv 中的参数)。
"Argv_emulation" 是一种 hack,用于将请求打开文件的 AppleEvents 转换为 sys.argv 中的额外参数。为此,模拟代码会启动一个事件循环,并等待那些打开事件或超时。您可能碰到了该超时问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接