构建 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 构建的。

这是ma​​in.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 installmake

如果您使用过安装程序,请检查它是否适合您的 Python 版本、操作系统和平台。

在 Windows 和 Ubuntu 上使用 python main.py 运行良好:

Scikit-Learn OK

我在 Ubuntu 16.04 LTS 上使用 sudo apt-get install python-scikits-learn 安装了 Scikit-learn。这是来自我运行该应用程序的设备的一些信息:

导入平台失败; platform.platform() :我无法获取此信息(应用无法启动),但它是 Android 5.1.1 导入系统确定; sys.version:2.7.2(默认,2017 年 3 月 6 日,06:05:36)[GCC 4.8] 导入 numpy 确定; Numpy.版本:1.9.2 导入 scipy 确定; Scipy.版本:0.18.1 import sklearn:错误(见上文)。

我尝试了几件事不成功,所以我上网查找:

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 构建不正确的主要内容,如果未能解决你的问题,请参考以下文章

xcode 项目构建成功但存档时:bitcode 包可以

Xcode 8 构建成功但存档失败

iOS 打包上线提交版本成功了,但是构建版本不出现

我应该如何构建包含 Cython 代码的 Python 包

如何为 kivy/python apk 选择包名?

Unity上传文件失败,但是python上传就能成功