简体   繁体   English

为什么 android 上的 kivy 应用程序会生成 Swiftclient 异常(需要 python-keystoneclient)但可以在桌面(Windows)上运行?

[英]Why kivy app on android generates Swiftclient exception (require python-keystoneclient) but works on desktop (Windows)?

I have been googling but I can't seem to find anything that can help me solve this problem on my own.我一直在谷歌搜索,但似乎找不到任何可以帮助我自己解决这个问题的东西。

I am creating an app which is meant for android, I want to be able to push data to Openstack ObjectStore using SwiftClient API.我正在创建一个适用于 android 的应用程序,我希望能够使用 SwiftClient API 将数据推送到 Openstack ObjectStore。 The current implementation works for the desktop version, but for android it crashes when it tries to use the "put_object()" function.当前实现适用于桌面版本,但对于 android,它在尝试使用“put_object()”function 时崩溃。 In my buildozer.spec file I have tried to include the package but it makes no difference.在我的 buildozer.spec 文件中,我尝试包含 package 但它没有区别。 I have of course also made sure to completely rebuild with buildozer by removing the generated folder '.buildozer' to make sure my changes are included.当然,我还确保使用 buildozer 完全重建,方法是删除生成的文件夹“.buildozer”,以确保包含我的更改。 I tried to search on the internet if maybe the problem is using python-keystoneclient on Android, maybe it isn't supported.如果问题可能是在 Android 上使用 python-keystoneclient,我尝试在 Internet 上进行搜索,可能不支持。 I did find a thread mentioning that keystoneclient might run in to random issues as an effect of other packages interfering, these are the current packages used in the application.我确实发现一个线程提到 keystoneclient 可能会因为其他包的干扰而遇到随机问题,这些是应用程序中当前使用的包。

In buildozer.spec:在 buildozer.spec 中:

requirements = python3,kivy==2.0.0,paho-mqtt,subprocess32,python-swiftclient,requests,urllib3,chardet,idna,python-keystoneclient

Code where I get the error:我得到错误的代码:

import logging
import constant
from swiftclient import client
from swiftclient.service import SwiftError


class SwiftClientManager:
    def __init__(self):
        self.client = client.Connection(
            authurl=constant.OS_AUTH_URL,
            user=constant.OS_USER,
            key=constant.OS_PASSWORD,
            auth_version=constant.OS_AUTH_VERSION,
            os_options={
                "project_id": constant.OS_PROJECT_ID,
                "user_id": constant.OS_USER_ID
                }
        )
        logging.basicConfig(level=logging.ERROR)
        logging.getLogger("requests").setLevel(logging.CRITICAL)
        logging.getLogger("swiftclient").setLevel(logging.CRITICAL)
        self.logger = logging.getLogger(__name__)
        self._opts = {'object_uu_threads': 20}

    def push_api(self, file_name, file_hierarchy, file_path):
        print(file_hierarchy)
        with open(file_path, "rb") as file:
            try:
                self.client.put_object(         # <--- here is where I get my error when it
                                                # tries to authenticate me for the server access
                    constant.OS_CONTAINER_NAME,
                    file_hierarchy + file_name + constant.LOG_FILE_TYPE,
                    contents=file.read(),
                    content_type=constant.LOG_FILE_TYPE + '/type'
                )
                pass
            except SwiftError:
                print('Could not upload file %s', file_name)
        file.close()

This is part of the stack trace I get from adb logcat | grep python这是我从adb logcat | grep python获得的堆栈跟踪的一部分adb logcat | grep python

03-30 10:57:17.237 17222 17282 I python  : Error: None Res: b''
03-30 10:57:17.274 17222 17282 I python  : Client initialized..
03-30 10:57:17.274 17222 17282 I python  : Client created..
03-30 10:57:17.279 17222 17282 I python  : [WARNING] [Base        ] Unknown <android> provider
03-30 10:57:17.279 17222 17282 I python  : [INFO   ] [Base        ] Start application main loop
03-30 10:57:20.823 17222 17282 I python  : [INFO   ] [Base        ] Leaving application in progress...
03-30 10:57:20.824 17222 17282 I python  :  Traceback (most recent call last):
03-30 10:57:20.824 17222 17282 I python  :    File "/path/to/app/main.py", line 125, in <module>
03-30 10:57:20.826 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/kivy/app.py", line 950, in run
03-30 10:57:20.826 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/kivy/base.py", line 582, in runTouchApp
03-30 10:57:20.826 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/kivy/base.py", line 347, in mainloop
03-30 10:57:20.826 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/kivy/base.py", line 391, in idle
03-30 10:57:20.826 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/kivy/base.py", line 342, in dispatch_input
03-30 10:57:20.826 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/kivy/base.py", line 308, in post_dispatch_input
03-30 10:57:20.827 17222 17282 I python  :    File "kivy/_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
03-30 10:57:20.827 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/kivy/uix/behaviors/button.py", line 179, in on_touch_up
03-30 10:57:20.827 17222 17282 I python  :    File "kivy/_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch
03-30 10:57:20.827 17222 17282 I python  :    File "kivy/_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
03-30 10:57:20.827 17222 17282 I python  :    File "kivy/_event.pyx", line 1132, in kivy._event.EventObservers._dispatch
03-30 10:57:20.827 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/kivy/lang/builder.py", line 57, in custom_callback
03-30 10:57:20.828 17222 17282 I python  :    File "/data/user/0/org.logger.logger/files/app/radiofingerprintlogger.kv", line 85, in <module>
03-30 10:57:20.833 17222 17282 I python  :      on_release: root.save_to_database()
03-30 10:57:20.833 17222 17282 I python  :    File "/path/to/app/.buildozer/android/app/main.py", line 80, in save_to_database
03-30 10:57:20.833 17222 17282 I python  :    File "/path/to/app/.buildozer/android/app/controller.py", line 114, in push_data
03-30 10:57:20.833 17222 17282 I python  :    File "/path/to/app/.buildozer/android/app/swift_client_manager.py", line 29, in push_api
03-30 10:57:20.833 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/swiftclient/client.py", line 2015, in put_object
03-30 10:57:20.834 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/swiftclient/client.py", line 1845, in _retry
03-30 10:57:20.834 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/swiftclient/client.py", line 1789, in get_auth
03-30 10:57:20.834 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/swiftclient/client.py", line 772, in get_auth
03-30 10:57:20.834 17222 17282 I python  :    File "/path/to/app/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/logger/swiftclient/client.py", line 615, in get_auth_keystone
03-30 10:57:20.834 17222 17282 I python  :  swiftclient.exceptions.ClientException: 
03-30 10:57:20.834 17222 17282 I python  :  Auth versions 2.0 and 3 require python-keystoneclient, install it or use Auth
03-30 10:57:20.834 17222 17282 I python  :  version 1.0 which requires ST_AUTH, ST_USER, and ST_KEY environment
03-30 10:57:20.834 17222 17282 I python  :  variables to be set or overridden with -A, -U, or -K.
03-30 10:57:20.834 17222 17282 I python  : Python for android ended.

So I thought I'd go back and update this question with how I worked around this issue.所以我想我会 go 回来并用我如何解决这个问题来更新这个问题。 I simply decided to use keystoneauth1 instead, this made the application work on both systems.我只是决定改用 keystoneauth1,这使得应用程序可以在两个系统上运行。 I hope this will help someone else in the future.我希望这将在未来对其他人有所帮助。 Cheers!干杯!

import logging
import constant
from swiftclient import client, ClientException
from swiftclient.service import SwiftError
from keystoneauth1.identity import v3
import keystoneauth1.session

logging.getLogger('requests').setLevel(logging.DEBUG)
logging.getLogger('keystoneclient').setLevel(logging.DEBUG)
logging.getLogger('swiftclient').setLevel(logging.DEBUG)


class SwiftClientManager:
    def __init__(self):
        auth = dict()
        auth['username'] = constant.OS_USERNAME
        auth['password'] = constant.OS_PASSWORD
        auth['auth_url'] = constant.OS_AUTH_URL
        auth['project_name'] = constant.OS_PROJECT_NAME
        auth['user_domain_name'] = constant.OS_USER_DOMAIN_NAME
        auth['project_domain_name'] = constant.OS_USER_DOMAIN_NAME

        # Create a password auth plugin
        auth = v3.Password(**auth)
        # Create session
        session = keystoneauth1.session.Session(auth=auth)
        self.conn = client.Connection(session=session)

    def push_to_api(self, file_name, file_hierarchy, file_path):
        with open(file_path, 'rb') as file:
            try:
                self.conn.put_object(
                    constant.OS_CONTAINER_NAME,
                    file_hierarchy + file_name + constant.LOG_FILE_TYPE,
                    contents=file.read(),
                    content_type=constant.LOG_FILE_TYPE + '/type'
                )
            except (SwiftError, ClientException, Exception) as e:
                print(constant.FILE_UPLOAD_ERROR_STRING, file_name)
                raise e
            finally:
                file.close()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM