我正在使用Python 2上的py2app,并且想知道是否有一种方法可以从代码中检测我的应用程序是作为已编译的.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中运行或不运行,如果是,请查看库的不同位置(即应用程序包的Resources文件夹)
帮助表示赞赏!
答案 0 :(得分:2)
Py2app将sys.frozen设置为“macosx_app”(对于应用程序包)。
避免问题的一种方法是使用“packages”选项:
setup(
...
options={
'py2app': {
'packages': ['audio'],
}
}
)
这包括应用程序包中的整个“audio”包作为目录,而不是将其添加到site-packages zipfile。这样您就不必检测是否在应用程序包中。