簡體   English   中英

Kivy 期間沒有名為 google 的模塊到帶有 Buildozer 的 apk

[英]No moduled named google during Kivy to apk with Buildozer

她是我的 main.py

# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager,Screen,FadeTransition   
from kivy.lang import Builder 
from kivy.properties import ObjectProperty, StringProperty
from kivy.core.text import LabelBase
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from kivy.storage.jsonstore import JsonStore


class MainWindow(Screen):
    pass

class SecondWindow(Screen):
    stored_data = ObjectProperty(None)
    def __init__(self,*args,**kwargs):
        super(Screen,self).__init__(*args,**kwargs),
        self.stored_data = JsonStore('data.json')

def gonder(self):
        name = self.ids.name.text

        scope = ["https://spreadsheets.google.com/feeds", 
'https://www.googleapis.com/auth/spreadsheets',
                 "https://www.googleapis.com/auth/drive.file", 
"https://www.googleapis.com/auth/drive"]

        creds = ServiceAccountCredentials.from_json_keyfile_name("creds.json", scope)
        client = gspread.authorize(creds)
        sheet = client.open("verigonder").sheet1
        sheet.append_row([name])

class ThirdWindow(Screen):
    pass
class WindowManager(ScreenManager):
    pass


class mainApp(App):
    def build(self):
        return Builder.load_file("my.kv")

if __name__ == "__main__":
    mainApp().run()

和 buildozer.spec 要求在這里

requirements = python3,kivy,gspread,oauth2client,google-auth-oauthlib,httplib2,pyasn1,pyasn1-modules,rsa,request,google

和調試日志

06-02 15:25:27.121 25609 25949 I python  :  Traceback (most recent call last):
06-02 15:25:27.121 25609 25949 I python  :    File 
"/home/ademberkaksoy/sheet/.buildozer/android/app/main.py", line 8, in <module>
06-02 15:25:27.121 25609 25949 I python  :    File 
"/home/ademberkaksoy/sheet/.buildozer/android/platform/build-armeabi-v7a/build/python- 
installs/myapp/gspread/__init__.py", line 16, in <module>
06-02 15:25:27.121 25609 25949 I python  :    File 
"/home/ademberkaksoy/sheet/.buildozer/android/platform/build-armeabi-v7a/build/python- 
installs/myapp/gspread/auth.py", line 12, in <module>
06-02 15:25:27.121 25609 25949 I python  :  ModuleNotFoundError: No module named 'google'
06-02 15:25:27.121 25609 25949 I python  : Python for android ended.

它仍然給出同樣的錯誤。 我需要做什么來解決這種情況? 它適用於筆記本電腦,但由於此錯誤,它不適用於 android。 我認為這一切都與 gspread 有關,但問題出在哪里,為什么仍然會出現此錯誤?

TL;DR:將google-auth添加到buildozer.spec的現有requirements

很長的故事:

是的 buildozer/p4a 默認還不能自動進行 package 依賴解析。

所以我們想要調試的方法是找到自己缺少哪個 package。 從堆棧跟蹤檢查這部分:

06-02 15:25:27.121 25609 25949 I python  :    File 
"/home/ademberkaksoy/sheet/.buildozer/android/platform/build-armeabi-v7a/build/python- 
installs/myapp/gspread/auth.py", line 12, in <module>
06-02 15:25:27.121 25609 25949 I python  :  ModuleNotFoundError: No module named 'google'

然后查看gspread package 和auth模塊究竟要導入什么。 從源代碼檢查: https://github.com/burnash/gspread/blob/v3.6.0/gspread/auth.py#L12

from google.oauth2.credentials import Credentials

所以現在我們需要查看在哪個 package 上定義了Credentials class。 有多種方法可以找到它,但由於我們知道它必須是一個依賴項,我們檢查同一個 package 的setup.py https://github.com/burnash/gspread/blob/v3.6.0/setup.py#L46-L50

    install_requires=[
        'requests>=2.2.1',
        'google-auth>=1.12.0',
        'google-auth-oauthlib>=0.4.1'
    ],

在這里,我們看到 3 個依賴項。 然后我們可以進一步搜索以查看 class 是否在其中一個中定義。 但實際上無論如何我們都需要依賴項。 所以我們可以簡單地將它們添加到buildozer.spec然后buildozer android cleanbuildozer android debug 應該是這樣的。

但是,如果我們仍然好奇,這里是它真正定義的地方https://github.com/googleapis/google-auth-library-python/blob/v1.16.0/google/oauth2/credentials.py#L50然后檢查該項目自述文件我們看到它確實來自google-auth package。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM