2013-07-15 18 views
2

我正在Python 2上使用py2app,并想知道是否有方法从代码中检测我的应用程序是作为已编译的.app文件的一部分运行还是作为独立脚本运行。Python:确定是否在.app包内运行?

这很重要,因为我的一些代码动态加载.dylib文件。当作为脚本本身运行时,此代码运行正常;然而,里面的.app运行的时候,我得到的是这样的:

Traceback (most recent call last): 
    File ".../python/game/dist/main.app/Contents/Resources/__boot__.py", line 316, in <module> 
    _run() 
    File ".../python/game/dist/main.app/Contents/Resources/__boot__.py", line 311, in _run 
    exec(compile(source, path, 'exec'), globals(), globals()) 
    File ".../python/game/dist/main.app/Contents/Resources/main.py", line 1, in <module> 
    import game 
    File "game.pyc", line 10, in <module> 
    File "gui.pyc", line 5, in <module> 
    File "audio/__init__.pyc", line 2, in <module> 
    File "audio/pybass.pyc", line 65, in <module> 
    File "ctypes/__init__.pyc", line 365, in __init__ 
OSError: dlopen(...python/game/dist/main.app/Contents/Resources/lib/python2.7/site-packages.zip/audio/libbass.dylib, 6): no suitable image found. Did find: 
    .../python/game/dist/main.app/Contents/Resources/lib/python2.7/site-packages.zip/audio/libbass.dylib: stat() failed with errno=20 
2013-07-15 02:50:21.146 main[10040:707] main Error 

我想最好的办法是移动名为.dylib文件库的外面,到资源,然后动态地加载在那里 - 但为了做到这一点,我需要在代码中检测我是否在.app中运行,如果是,请在库的另一个位置查找(即应用程序包的Res​​ources文件夹)

帮助赞赏!

回答

2

Py2app将sys.frozen设置为“macosx_app”(用于应用程序包)。

避免你的问题的一个方法是使用“包”选项:

setup(
    ... 
    options={ 
    'py2app': { 
     'packages': ['audio'], 
     } 
    } 
) 

这包括在应用程序包的目录整个“音频”包装,而不是将它添加到站点包的zip文件。这样你就不必检测你是否在应用程序包中。