相对导入和py2app?

时间:2016-01-30 04:06:57

标签: python setuptools setup.py py2app

以下是我的文件布局方式:

| setup.py
+ myapp
  | __init__.py
  | myapp.py
  | version.py

(希望明白......不要太复杂,我不要想。)

这是myapp.py包含的内容:

from fingui   import Label
from .version import __version__

Label('I am version: ' + __version__)

如果我在可以看到setup.py的目录中,以下工作正常:

python -m myapp.myapp

当我尝试使用以下方法将其打包为应用程序时:

python setup.py py2app

然后运行它,我在导入版本的行上收到此错误消息:

ValueError: Attempted relative import in non-package

这里是setup.py的内容:

exec(open('myapp/version.py').read())

from setuptools import setup

setup(app                = 'myapp/myapp.py',
      setup_requirements = ['py2app'],
      name               = 'MyApp',
      version            = __version__)

如果我查看py2app已生成的应用包,我看到myapp.py已放入包中,但无法找到version.py__init__.py

构建文件的正确方法是什么?如何让py2app和/或setup识别出哪些文件是必需的以及将它们放在哪里?

此外,虽然我们关注这个主题,但如何让它包括fingui?这是我使用pip安装的库...我认为py2app可能会将其误认为是标准库模块或其他东西,所以不在我的应用包中包含它?

2 个答案:

答案 0 :(得分:1)

我能够通过以下方式解决这个问题:

| main.py   <- New file I added - details below.
| setup.py  <- I changed a bit in here.
+ myapp     <- Same exact contents as before - I changed nothing.

我创建了一个新文件main.py,它位于myapp包之外。在setup.py中,我告诉它main.py是应用,而myapp是一个包。

main.py的内容:

from myapp import myapp

就是这样。

setup.py的新内容,其中包含对已更改行的注释。

exec(open('myapp/version.py').read())

from setuptools import setup

setup(app                = 'main.py',  ### This now points at main.py instead of myapp/myapp.py
      options            = {'py2app': {'packages': ['myapp']}}, ### This line is all new.
      setup_requirements = ['py2app'],
      name               = 'MyApp',
      version            = __version__)

我仍然遇到这样的问题:它似乎没有将myappfingui复制到实际的MyApp.app捆绑包中...我认为它依赖于MyApp.app/Contents/Resources/site.pyc ...如果我尝试分发我的应用程序,这显然会中断。

答案 1 :(得分:-1)

尝试以这种方式导入包:导入fingui而不是fingui import *