【问题标题】:Why does a py2app .app take longer to launch than the same python program?为什么 py2app .app 的启动时间比同一个 python 程序要长?
【发布时间】:2013-01-01 10:12:35
【问题描述】:

我不确定我的问题/标题措辞是否正确。我正在开发 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]
)

【问题讨论】:

    标签: python c macos setuptools py2app


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-24
        • 2022-08-22
        • 2022-01-15
        • 2022-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        相关资源
        最近更新 更多