我想在 OSX 上(使用 py2app)和 Debian 包分发我的应用程序。
我的应用程序的结构如下:
app/
debian/
<lots of debian related stuff>
scripts/
app
app/
__init__.py
app.py
mod1/
__init__.py
a.py
mod2/
__init__.py
b.py
我的 setup.py 看起来像:
from setuptools import setup
import os
import os.path
osname = os.uname()[0]
if osname == 'Darwin':
APP = ['app/app.py']
DATA_FILES = []
OPTIONS = {'argv_emulation': True}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
elif osname == 'Linux':
setup(
name = "app",
version = "0.0.1",
description = "foo bar",
packages = ["app", "app.mod1", "app.mod2"],
scripts = ["scripts/app"],
data_files = [
("/usr/bin", ["scripts/app"]),
]
)
然后,在 b.py (这是在 OSX 上):
from app.mod2.b import *
我得到:
ImportError: No module named mod2.b
所以基本上,mod2 无法访问 mod1。在 Linux 上没有问题,因为 python 模块 'app' 全局安装在 /usr/shared/pyshared 中。但在 OSX 上,该应用程序显然是由 py2app 构建的独立 .app 东西。我想知道我是否完全错误地处理了这个问题,在 OSX 上分发 Python 应用程序时是否有任何最佳实践?
编辑:我也在 b.py 中尝试过这样的 hack:
from ..mod2.b import *
ValueError: Attempted relative import beyond toplevel package
Edit2:似乎与这个如何在 Python 中进行相对导入有关?