Как вы создаете kivy apk из пакета?

У меня есть простой пакет python/kivy, из которого я хочу создать Android APK с помощью Buildozer. Пакет из корня организован как:

.
├── bin
│   ├── kivy_test-0.1-debug.apk
│   └── myapp-0.1-debug.apk
├── buildozer.spec
├── __init__.py
└── kivy_app
    ├── __init__.py
    ├── __main__.py
    └── source
        ├── main.py
        └── version.py

Модуль main.py это:

from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.button import Label
from kivy.lang import Builder

from version import VERSION

root = Builder.load_string('''
<MainFrame>:
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Hola mundo!'
        Label:
            text: root.version
''')

class MainFrame(Screen):
    version = 'Version: %s' % VERSION
    def __init__(self, **kwargs):
        super(MainFrame, self).__init__(**kwargs)

class BasicApp(App):
    def build(self):
        return MainFrame()

if __name__ == '__main__':
    BasicApp().run()

версия.py это

__all__ = 'VERSION'

VERSION = '0.0.2'

а _main_.py — это

from .source.main import BasicApp

def main():
    BasicApp().run()

if __name__ == "__main__":
    main()

У меня проблема в том, что когда я запускаю модуль, набрав

python -m kivy_app

в корневом каталоге мне нужна строка

from .version import VERSION

в main.py (обратите внимание, что перед версией стоит '.').

С другой стороны, когда я собираю apk для Android из корневого каталога, buildozer.spec использует строку:

# (str) Source code where the main.py live
source.dir = ./kivy_app/source

и, конечно же, вызывает строки:

if __name__ == '__main__':
     BasicApp().run()

в main.py.

В этом случае модуль обрабатывается так, как будто он не находится в пакете, поэтому ему нужна строка:

from version import VERSION

(В этом случае нет «.» перед версией в операторе импорта)

Как я могу разрешить этот конфликт?


person Psionman    schedule 02.09.2019    source источник


Ответы (1)


Решение этого конфликта состоит в том, чтобы скопировать _main_.py в main.py и заменить строку:

from .source.main import BasicApp

с:

from source.main import BasicApp

В buildozer.spec заменить:

source.dir = ./kivy_app/source

с:

source.dir = ./kivy_app

Теперь дерево:

.
├── bin
│   ├── kivy_test-0.1-debug.apk
│   └── myapp-0.1-debug.apk
├── buildozer.spec
├── __init__.py
└── kivy_app
    ├── __init__.py
    ├── __main__.py
    ├── main.py
    └── source
        ├── main.py
        └── version.py
person Psionman    schedule 03.09.2019