作为学习Kivy的练习,我使用PyDictionary创建了一个简单的应用程序。它在我的Windows Python环境中运行良好。但是当它转换成工作的apk文件时,它给了我很多问题。
据我所知,我们需要确定模块是否是纯python,并且它们导入kivy的方法会有所不同。但我不知道如何确定模块是否是纯Python?
对于PyDictionary,它具有goslate,requests和beautifulsoup4的依赖关系。我在main.py和.spec文件中尝试了很多东西。
main.py
__version__ = '1.0'
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.scrollview import ScrollView
from kivy.lang import Builder
from kivy.properties import StringProperty
from PyDictionary import PyDictionary
import requests, goslate, lxml, bs4
class SomeApp(App):
def build(self):
btn = Button(text='Hello World')
dictionary = PyDictionary()
dictStuff = dictionary.meaning('People')
return btn
SomeApp().run()
buildozer.spec
[app]
# (str) Title of your application
title = AudioDict Test1 Application
# (str) Package name
package.name = audiodicttest1app
# (str) Package domain (needed for android/ios packaging)
package.domain = org.test
# (str) Source code where the main.py live
source.dir = .
# (list) Source files to include (let empty to include all the files)
source.include_exts = py,png,jpg,kv,atlas
# (list) Source files to exclude (let empty to not exclude anything)
#source.exclude_exts = spec
# (list) List of directory to exclude (let empty to not exclude anything)
#source.exclude_dirs = tests, bin
# (list) List of exclusions using pattern matching
#source.exclude_patterns = license,images/*/*.jpg
# (str) Application versioning (method 1)
version = 1.0
# (str) Application versioning (method 2)
# version.regex = __version__ = ['"](.*)['"]
# version.filename = %(source.dir)s/main.py
# (list) Application requirements
# comma seperated e.g. requirements = sqlite3,kivy
requirements = kivy, requests, beautifulsoup4, goslate, lxml
# (str) Custom source folders for requirements
# Sets custom source for any requirements with recipes
# requirements.source.kivy = ../../kivy
# (list) Garden requirements
#garden_requirements =
# (str) Presplash of the application
#presplash.filename = %(source.dir)s/data/presplash.png
# (str) Icon of the application
#icon.filename = %(source.dir)s/data/icon.png
# (str) Supported orientation (one of landscape, portrait or all)
orientation = all
# (list) List of service to declare
#services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY
#
# OSX Specific
#
#
# author = © Copyright Info
#
# Android specific
#
# (bool) Indicate if the application should be fullscreen or not
fullscreen = 1
# (list) Permissions
#android.permissions = INTERNET
# (int) Android API to use
#android.api = 19
# (int) Minimum API required
android.minapi = 13
# (int) Android SDK version to use
#android.sdk = 20
# (str) Android NDK version to use
#android.ndk = 9c
# (bool) Use --private data storage (True) or --dir public storage (False)
#android.private_storage = True
# (str) Android NDK directory (if empty, it will be automatically downloaded.)
#android.ndk_path =
# (str) Android SDK directory (if empty, it will be automatically downloaded.)
#android.sdk_path =
# (str) ANT directory (if empty, it will be automatically downloaded.)
#android.ant_path =
# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github)
#android.p4a_dir =
# (list) python-for-android whitelist
#android.p4a_whitelist =
# (bool) If True, then skip trying to update the Android sdk
# This can be useful to avoid excess Internet downloads or save time
# when an update is due and you just want to test/build your package
# android.skip_update = False
# (str) Android entry point, default is ok for Kivy-based app
#android.entrypoint = org.renpy.android.PythonActivity
# (list) List of Java .jar files to add to the libs so that pyjnius can access
# their classes. Don't add jars that you do not need, since extra jars can slow
# down the build process. Allows wildcards matching, for example:
# OUYA-ODK/libs/*.jar
#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar
# (list) List of Java files to add to the android project (can be java or a
# directory containing the files)
#android.add_src =
# (str) python-for-android branch to use, if not master, useful to try
# not yet merged features.
#android.branch = master
# (str) OUYA Console category. Should be one of GAME or APP
# If you leave this blank, OUYA support will not be enabled
#android.ouya.category = GAME
# (str) Filename of OUYA Console icon. It must be a 732x412 png image.
#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png
# (str) XML file to include as an intent filters in <activity> tag
#android.manifest.intent_filters =
# (list) Android additionnal libraries to copy into libs/armeabi
#android.add_libs_armeabi = libs/android/*.so
#android.add_libs_armeabi_v7a = libs/android-v7/*.so
#android.add_libs_x86 = libs/android-x86/*.so
#android.add_libs_mips = libs/android-mips/*.so
# (bool) Indicate whether the screen should stay on
# Don't forget to add the WAKE_LOCK permission if you set this to True
#android.wakelock = False
# (list) Android application meta-data to set (key=value format)
#android.meta_data =
# (list) Android library project to add (will be added in the
# project.properties automatically.)
#android.library_references =
# (str) Android logcat filters to use
#android.logcat_filters = *:S python:D
# (bool) Copy library instead of making a libpymodules.so
#android.copy_libs = 1
#
# iOS specific
#
# (str) Name of the certificate to use for signing the debug version
# Get a list of available identities: buildozer ios list_identities
#ios.codesign.debug = "iPhone Developer: <lastname> <firstname> (<hexstring>)"
# (str) Name of the certificate to use for signing the release version
#ios.codesign.release = %(ios.codesign.debug)s
[buildozer]
# (int) Log level (0 = error only, 1 = info, 2 = debug (with command output))
log_level = =2
# (int) Display warning if buildozer is run as root (0 = False, 1 = True)
warn_on_root = 1
# -----------------------------------------------------------------------------
# List as sections
#
# You can define all the "list" as [section:key].
# Each line will be considered as a option to the list.
# Let's take [app] / source.exclude_patterns.
# Instead of doing:
#
#[app]
#source.exclude_patterns = license,data/audio/*.wav,data/images/original/*
#
# This can be translated into:
#
#[app:source.exclude_patterns]
#license
#data/audio/*.wav
#data/images/original/*
#
# -----------------------------------------------------------------------------
# Profiles
#
# You can extend section / key with a profile
# For example, you want to deploy a demo version of your application without
# HD content. You could first change the title to add "(demo)" in the name
# and extend the excluded directories to remove the HD content.
#
#[app@demo]
#title = My Application (demo)
#
#[app:source.exclude_patterns@demo]
#images/hd/*
#
# Then, invoke the command line with the "demo" profile:
#
#buildozer --profile demo android debug
logcat.txt中的一些导入错误
I/python (11215): (ImportError: No module named cdrom)
I/python (11215): ImportError: cannot import name HTTPSHandler
I/python (12538): ImportError: No module named PyDictionary
我还尝试手动复制并粘贴包含PyDictionary的文件夹,并在main.py import语句中进行手动连接。这也行不通。任何帮助或指南将不胜感激!
更新错误:
D/SurfaceFlinger( 273): FPS : 8.95
W/SurfaceFlinger( 273): Fail to Open /sys/devices/platform/gpusysfs/fps
I/python (29404): /data/data/org.test.audiocomboapp/files/lib/python2.7/site-packages/kivy/core/image/img_pygame.py:13: RuntimeWarning: import cdrom: No module named cdrom
I/python (29404): (ImportError: No module named cdrom)
I/python (29404): [INFO ] [Image ] Providers: img_tex, img_dds, img_gif, img_pygame (img_pil, img_ffpyplayer ignored)
V/AlarmManager( 833): waitForAlarm result :8
...
I/python (30405): /data/data/org.test.audiodicttest1app/files/lib/python2.7/site-packages/kivy/core/image/img_pygame.py:13: RuntimeWarning: import cdrom: No module named cdrom
I/python (30405): (ImportError: No module named cdrom)
I/python (30405): [INFO ] [Image ] Providers: img_tex, img_dds, img_gif, img_pygame (img_pil, img_ffpyplayer ignored)
I/python (30405): [INFO ] [Text ] Provider: pygame
E/SMD (30200): smd Interface open failed errno is 2 -1
E/NetlinkEvent( 291): NetlinkEvent::FindParam(): Parameter 'TIME_NS' not found
E/SMD (30200): smd Interface open failed errno is 2 -1
E/SMD (30200): smd Interface open failed errno is 2 -1
...
E/SMD (30200): smd Interface open failed errno is 2 -1
E/SMD (30200): smd Interface open failed errno is 2 -1
I/python (30405): Traceback (most recent call last):
I/python (30405): File "/home/linuxkw/Dropbox/iLinux_sharing/AudioDict_KW5/.buildozer/android/app/main.py", line 13, in <module>
I/python (30405): File "/home/linuxkw/Dropbox/iLinux_sharing/AudioDict_KW5/.buildozer/android/app/_applibs/PyDictionary/__init__.py", line 7, in <module>
I/python (30405): File "/home/linuxkw/Dropbox/iLinux_sharing/AudioDict_KW5/.buildozer/android/app/_applibs/PyDictionary/core.py", line 6, in <module>
I/python (30405): File "/home/linuxkw/Dropbox/iLinux_sharing/AudioDict_KW5/.buildozer/android/app/_applibs/PyDictionary/utils.py", line 2, in <module>
I/python (30405): File "/home/linuxkw/Dropbox/iLinux_sharing/AudioDict_KW5/.buildozer/android/app/_applibs/bs4/__init__.py", line 30, in <module>
I/python (30405): File "/home/linuxkw/Dropbox/iLinux_sharing/AudioDict_KW5/.buildozer/android/app/_applibs/bs4/builder/__init__.py", line 311, in <module>
I/python (30405): ImportError: cannot import name _htmlparser
I/python (30405): Python for android ended.
I/art (30405): System.exit called, status: 0
I/AndroidRuntime(30405): VM exiting with result code 0, cleanup skipped.
I/WindowState( 833): WIN DEATH: Window{114cacab u0 org.test.audiodicttest1app/org.renpy.android.PythonActivity}
W/WindowManager( 833): Force-removing child win Window{398f3352 u0 SurfaceView} from container Window{114cacab u0 org.test.audiodicttest1app/org.renpy.android.PythonActivity}
...
I/python (30490): [INFO ] [Logger ] Record log in /data/data/org.test.audiodicttest1app/files/.kivy/logs/kivy_16-05-08_1.txt
I/python (30490): [INFO ] [Kivy ] v1.9.1
I/python (30490): [INFO ] [Python ] v2.7.2 (default, May 8 2016, 15:20:14)
I/python (30490): [GCC 4.8]
I/python (30490): [INFO ] [Factory ] 179 symbols loaded
E/Diag_Lib(30523): Diag_LSM_Init: Failed to open handle to diag driver, error = 2
D/SSRM:n ( 833): SIOP:: AP = 420, CUR = 460
E/SMD (30200): smd Interface open failed errno is 2 -1
I/python (30490): /data/data/org.test.audiodicttest1app/files/lib/python2.7/site-packages/kivy/core/image/img_pygame.py:13: RuntimeWarning: import cdrom: No module named cdrom
I/python (30490): (ImportError: No module named cdrom)
I/python (30490): [INFO ] [Image ] Providers: img_tex, img_dds, img_gif, img_pygame (img_pil, img_ffpyplayer ignored)
I/python (30490): [INFO ] [Text ] Provider: pygame
E/SMD (30200): smd Interface open failed errno is 2 -1
D/PackageManager( 833): [MSG] WRITE_PACKAGE_RESTRICTIONS
D/ResourcesManager( 1729): creating new AssetManager and set to /data/app/com.dropbox.android-1/base.apk
E/SMD (30200): smd Interface open failed errno is 2 -1