构建 Python 包成功,但是 Scikit-learn 构建不正确
Posted
技术标签:
【中文标题】构建 Python 包成功,但是 Scikit-learn 构建不正确【英文标题】:Building Python packages succeeds, but Scikit-learn is improperly built 【发布时间】:2017-07-26 01:00:50 【问题描述】:我使用 Scikit-learn 和 Kivy 创建了一个应用,它是使用 Buildozer 构建的。
这是main.py的代码:
# coding=utf-8
import kivy
import sys
kivy.require('1.9.0')
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
try:
from sklearn import svm, datasets
except:
return Label(text=str(sys.exc_info()[1]))
else:
return Label(text='Scikit-learn OK')
if __name__ == '__main__':
MyApp().run()
我在 buildozer.spec 的要求中指定了 Scikit-learn:
[app]
title = Kivyris
package.name = kivyris
package.domain = org.test
source.dir = .
source.include_exts = py,png,jpg,kv,atlas
version = 0.1
requirements = kivy,numpy,scipy,scikit-learn
orientation = landscape
fullscreen = 1
log_level = 2
warn_on_root = 1
我运行了buildozer android_new debug deploy run
(没有错误,APK 文件已创建并部署),但应用启动时出现以下错误:
无法加载库:
/data/data/org.test.kivyris/files/app/lib/python2.7/site-packages/sklearn/check_build 的内容: __init.pyo setup.pyo _check_build.so
似乎 sckikit-learn 没有正确构建。
如果你已经从源代码安装了 scikit-learn,请不要忘记在使用前构建包;在源目录中运行
python setup.py install
或make
。如果您使用过安装程序,请检查它是否适合您的 Python 版本、操作系统和平台。
在 Windows 和 Ubuntu 上使用 python main.py
运行良好:
Scikit-Learn OK
我在 Ubuntu 16.04 LTS 上使用 sudo apt-get install python-scikits-learn
安装了 Scikit-learn。这是来自我运行该应用程序的设备的一些信息:
我尝试了几件事不成功,所以我上网查找:
https://unix.stackexchange.com/questions/240239/building-python-packages-succeeds-but-package-is-improperly-built/240260 :对我不起作用。 Import scikit in C# application : 不是我想要的。 https://github.com/scikit-learn/scikit-learn/issues/433:适用于 Mac,不适用于 Ubuntu。 Cannot import Scikit-Learn:scipy 适合我。我没有发现任何有用的东西,我不知道如何解决这个问题。请问有什么办法吗?
谢谢。
【问题讨论】:
你为什么要这样做?由于 scipies 巨大的大小,构建的apk
文件约为 70mb。
我有一个使用 SVM 的 Python 应用程序,我正在尝试迁移到 Android。由于它使用 Scikit-learn(和 iris 数据集),我认为使用 Buildozer 可能是个好主意。
当然这是个好主意,但它会很重。我建议你开发一个rest API来为你做计算。
【参考方案1】:
当您尝试使用纯 Python 的模块构建适用于 Android 的应用时,一切正常:该模块将由为 Android 构建并随您的应用一起提供的 Python 解释器运行。
当您尝试使用包含 C 扩展或具有 C 扩展的依赖项(例如 Scikit-learn)为 Android 构建应用程序时,情况会更糟。在 Windows 或 Linux C Extensions would be 上使用 distutils 编译,但对于 Android,问题是:C Extensions 不能以这种方式编译。
python-for-android 处理这个问题providing 配方机制:
recipe:recipe 是定义如何编译需求的文件。 任何具有 Python 扩展的库都必须在 p4a 中有一个配方, 否则编译会失败。如果没有需求的配方,它 将使用 pip 下载。
您可以查看现有食谱列表here。正如你所看到的,没有人为 Scikit-learn 做过任何事情,所以我认为它现在不能为 Android 构建。
您可以手动尝试create recipe 获取此模块,或在kivy Google group 中寻求帮助。请注意,这可能不是一项简单的任务。
【讨论】:
以上是关于构建 Python 包成功,但是 Scikit-learn 构建不正确的主要内容,如果未能解决你的问题,请参考以下文章