4

私の質問/タイトルの言い回しが正しいかどうか確信が持てません。私はOSX 10.6とpython 2.7.1に取り組んでいます。setuptools と py2app を使用して .app を作成しました。これは、ファインダーから、または open を使用してターミナルから実行できます。

プログラムの私の目標の 1 つは、迅速にローンチすることです。

ビルド フォルダーに移動し、python を使用して直接 python プログラムを実行すると、ウィンドウがすぐにポップアップします。1秒以内。それはかなり一貫しています。しかし、dist フォルダーに移動して .app を (ファインダーから、または開いて) 実行すると、ウィンドウが表示される前に数秒の一時停止があります。約 4 ~ 5 秒、かなり一貫して。

ドキュメントか何かを見つけようとしているオープンと関係があるのではないかと思ったので、これを試しました:

open -a testrun.app ""

..確かに、ウィンドウはすぐにポップします!

これがドキュメント指向のプログラムではないことを伝えるために setup.py またはどこかで何かする必要がありますか?

もう少し詳しく――

私はOSX 10.6.8でPython 2.7.1を使用しています(システムpythonとして)。これについていくつかのマイナーなバリエーションを試しました(python_selectを使用した2.6、virtualenvの2.7.3..)が、これまでのところ違いはありません。

ココアを使用してウィンドウを開く関数をエクスポートする単純な .dylib (objective-c) を作成しました。.dylib 関数を呼び出す関数を含む非常に単純な python 拡張モジュール (c) を作成しました。

(私の計画は、GUI 呼び出しと関連するプラットフォーム固有の呼び出し用のプラットフォーム言語でプラットフォーム固有の共有/動的ライブラリを作成し、それを使用するクロスプラットフォームの c ライブラリを作成してから、c を作成する高レベル言語拡張モジュールを作成することです。これらの言語で利用可能なライブラリ)。

c 関数を呼び出す非常に単純な python プログラムを作成しました。すべてをビルドし、py2app を使用して .app を作成する setup.py を作成しました。

.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]
)
4

2 に答える 2

2

その機能が実際に必要でない限り(つまり、アプリケーションバンドルにファイルをドロップして、それらのファイル名をsys.argvの引数として持つことができるようにしたい場合を除いて)、「argv_emulation」をFalseに設定します。

「Argv_emulation」は、ファイルを開くことを要求するAppleEventをsys.argvの追加の引数に変換するためのハックです。これを行うために、エミュレーションコードはイベントループを起動し、それらの開いているイベントまたはタイムアウトを待ちます。そのタイムアウトに遭遇している可能性があります。

于 2013-02-20T09:07:13.910 に答える
2

Mac の py2app については知りません (使用したことはありません) が、http://www.pyinstaller.org/と同様に機能する場合、バイナリは python ランタイム、プログラム、およびすべてのモジュールをメモリに展開する必要があります。これには時間がかかります。

于 2013-01-18T18:35:13.530 に答える