Относительный импорт и 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 может принять ее за стандартный библиотечный модуль или что-то в этом роде, поэтому не включать ее в мой пакет приложений?


person ArtOfWarfare    schedule 30.01.2016    source источник


Ответы (2)


Я смог исправить это следующим образом:

| 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__)

У меня все еще есть проблема, что он, кажется, не копирует myapp или fingui в фактический пакет MyApp.app... Я думаю, что он полагается на MyApp.app/Contents/Resources/site.pyc... который, очевидно, сломается, если я попытаюсь распространить свое приложение.

person ArtOfWarfare    schedule 30.01.2016

Попробуйте импортировать пакет следующим образом: импортируйте fingui вместо импорта из fingui *

person webapp    schedule 30.01.2016
comment
Проблема с импортом версии, а не с fingui. - person ArtOfWarfare; 30.01.2016