2013-01-17 16 views
4

我不確定我的問題/標題是否正確。我正在開發OSX 10.6和Python 2.7.1。我使用setuptools和py2app來創建一個.app,我可以使用open從finder或者終端運行它。爲什麼py2app應用程序比同一個python程序啓動需要更長的時間?

該計劃的目標之一是快速啓動。

當我進入構建文件夾並直接使用python運行python程序時,我的窗口立即彈出。在不到1秒內。這是相當一致的。但是,當我進入dist文件夾並運行.app(從查找程序或打開)時,窗口出現之前會有幾秒鐘的暫停。大概持續4到5秒鐘。

我想也許這有事可做開放試圖找到一個文件或東西,所以我嘗試這樣做:

open -a testrun.app "" 

..和果然,窗口彈出的時候了!

有什麼我需要做的setup.py或某個地方告訴它,這不是一個面向文檔的程序?

更詳細一點 -

我工作的OSX 10.6.8與Python 2.7.1(作爲系統蟒蛇)。我已經嘗試了一些小的變化(在python_select中爲2.6,在virtualenv中爲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

我不知道在Mac上(從來沒有使用過),但如果它py2app類似於http://www.pyinstaller.org/,那麼二進制文件必須將python運行時,程序和所有模塊解壓縮到內存中。這需要時間。

2

除非您確實需要該功能,否則請將「argv_emulation」設置爲False(即,除非您希望能夠在應用程序包上放置文件,然後將這些文件名作爲sys.argv中的參數)。

「Argv_emulation」是一個用於將AppleEvents請求打開文件轉換爲sys.argv中的額外參數的黑客攻擊。爲了做到這一點,仿真代碼加速了一個事件循環,並等待這些打開的事件或超時。你可能會遇到這種超時。

相關問題