我想分發我的應用程序在OSX(使用py2app)和Debian軟件包。Python應用程序分發跨平臺
我的應用程序的結構是這樣的:
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:
from ..mod2.b import *
ValueError: Attempted relative import beyond toplevel package
EDIT2:似乎與此有關How to do relative imports in Python?
這可以解決嗎?如果應用程序不在路徑中,應用程序如何首先到達程序包的__init__模塊? – u0b34a0f6ae