Python:确定是否在 .app 包内运行?

标签 python py2app

我正在 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 文件夹)

感谢帮助!

最佳答案

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

避免问题的一种方法是使用“packages”选项:

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

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

关于Python:确定是否在 .app 包内运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17649274/

相关文章:

python - 在多索引数据框中查找列的最大值并返回其所有值

python - 将字符串解析为 boolean 值?

python - 我的 py2app 应用程序无法打开。有什么问题?

python - 带有 Django 的 Bootstrap 上的事件标签

python - 获取 3D 空间中平面多边形顶点的局部 2D 坐标

python - 类型错误 : callback() takes exactly 2 arguments (0 given)

python - 好的 Python 2 音频模块

Python应用跨平台分发

python - 如何将 tkinter 窗口放在其他窗口之上?

py2app- "includes"和 "packages"变量有什么区别?