Kivy Buildozer:aiohttp 异步问题,应用程序崩溃

问题描述 投票:0回答:1

我会尝试准确地解释我的问题。 首先,我的 kivy 应用程序及其所有部分都可以在 VScode 中运行。 这是一个计算器应用程序,可以抓取一些数据并计算它们

Python版本:3.11.7 Kivy版本:2.3.0

我的代码中有两个函数,所以我希望它们同时协同工作,所以我使用了 aiohttp asyncio。开始吧

我在应用程序中使用的库

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.uix.behaviors import ButtonBehavior
from kivy.metrics import dp
from kivy.clock import mainthread
from kivy.uix.popup import Popup
from kivy.factory import Factory
from kivy.properties import ObjectProperty
from time import sleep
from unidecode import unidecode
from bs4 import BeautifulSoup
import aiohttp
import asyncio
import requests
import threading
import re 

aiohttp / asyncio 的代码示例

@mainthread
    def calculate(self, lig, *args):


        async def fetch_stats_home(session, url, match_codes_home):
            try:
                querystring = {}
                headers = {}

                async with session.get(url, params=querystring, headers=headers) as response:
                    
                    soup = BeautifulSoup(await response.text(), "html.parser")

                
           
        async def fetch_stats_away(session, url, match_codes_away):

            try:
                querystring = {}
                headers = {}

                async with session.get(url, params=querystring, headers=headers) as response:

                    soup = BeautifulSoup(await response.text(), "html.parser")                  

            except:
                pass         

        async def main():
            url = "https://Handler.aspx"    
            match_codes_home = evsahibi_evindeki_maclar_kodlar
            match_codes_away = deplasman_deplasmandki_maclar_kodlar  

            async with aiohttp.ClientSession() as session:
                tasks_home  = [fetch_stats_home(session, url, match_code) for match_code in match_codes_home]
                tasks_away  = [fetch_stats_away(session, url, match_code) for match_code in match_codes_away]
                await asyncio.gather(*tasks_home, *tasks_away)

        asyncio.run(main())

VSCODE 测试和终端日志(应用程序运行没有问题)

[DEBUG  ] [Using proactor] IocpProactor
[DEBUG  ] [Starting new HTTPS connection (1)] .com:443
[DEBUG  ] [https          ]//.com:443 "GET /Takim/451/ HTTP/1.1" 200 27720
[DEBUG  ] [https          ]//.com:443 "GET /Takim/570/ HTTP/1.1" 200 28575
[DEBUG  ] [Using proactor] IocpProactor
[DEBUG  ] [Starting new HTTPS connection (1)] arsiv.mackolik.com:443
[DEBUG  ] [https          ]//.com:443 "GET /Takim/3/ HTTP/1.1" 200 29920
[DEBUG  ] [https          ]//:443 "GET /Takim/447/ HTTP/1.1" 200 28574
[DEBUG  ] [Using proactor] IocpProactor
[DEBUG  ] [Starting new HTTPS connection (1)] arsiv.mackolik.com:443
[DEBUG  ] [https          ]//:443 "GET /Takim/8/ HTTP/1.1" 200 28140
[DEBUG  ] [https          ]//:443 "GET /Takim/448/ HTTP/1.1" 200 28235
[DEBUG  ] [Using proactor] IocpProactor
Scroll 1
APP WORKS

BUILDOZER:我在 Buildozer 中编译了应用程序,当我单击“计算”按钮时,应用程序崩溃了。

这是日志adb logcat -s python

正如你所看到的,在第一次[使用proactor] IocpProactor时,APP崩溃了。

Starting new HTTPS connection (1)] arsiv.mackolik.com:443

02-17 13:59:55.087 12778 13111 I python  : [DEBUG  ] [https          ]//arsiv.mackolik.com:443 "GET /Takim/574/ HTTP/1.1" 200 27720
02-17 13:59:56.036 12778 13111 I python  : [DEBUG  ] [https          ]//arsiv.mackolik.com:443 "GET /Takim/446/ HTTP/1.1" 200 28575
02-17 13:59:56.346 12778 13111 I python  : [DEBUG  ] [Using selector] EpollSelector

02-17 13:59:56.762 12778 13111 I python  : [INFO   ] [Base        ] Leaving application in progress...
02-17 13:59:56.763 12778 13111 I python  :  Traceback (most recent call last):
02-17 13:59:56.763 12778 13111 I python  :    File "/home/seo/Desktop/APP/.buildozer/android/app/main.py", line 825, in <module>
02-17 13:59:56.763 12778 13111 I python  :    File "/home/seo/Desktop/APP/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/footballpredictor/arm64-v8a/kivy/app.py", line 956, in run
02-17 13:59:56.763 12778 13111 I python  :    File "/home/seo/Desktop/APP/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/footballpredictor/arm64-v8a/kivy/base.py", line 574, in runTouchApp
02-17 13:59:56.764 12778 13111 I python  :    File "/home/seo/Desktop/APP/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/footballpredictor/arm64-v8a/kivy/base.py", line 339, in mainloop
02-17 13:59:56.764 12778 13111 I python  :    File "/home/seo/Desktop/APP/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/footballpredictor/arm64-v8a/kivy/base.py", line 379, in idle
02-17 13:59:56.764 12778 13111 I python  :    File "/home/seo/Desktop/APP/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/footballpredictor/arm64-v8a/kivy/clock.py", line 733, in tick
02-17 13:59:56.765 12778 13111 I python  :    File "/home/seo/Desktop/APP/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/footballpredictor/arm64-v8a/kivy/clock.py", line 776, in post_idle
02-17 13:59:56.765 12778 13111 I python  :    File "kivy/_clock.pyx", line 620, in kivy._clock.CyClockBase._process_events
02-17 13:59:56.765 12778 13111 I python  :    File "kivy/_clock.pyx", line 653, in kivy._clock.CyClockBase._process_events
02-17 13:59:56.765 12778 13111 I python  :    File "kivy/_clock.pyx", line 649, in kivy._clock.CyClockBase._process_events
02-17 13:59:56.766 12778 13111 I python  :    File "kivy/_clock.pyx", line 218, in kivy._clock.ClockEvent.tick
02-17 13:59:56.766 12778 13111 I python  :    File "/home/seo/Desktop/APP/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/footballpredictor/arm64-v8a/kivy/clock.py", line 1095, in callback_func
02-17 13:59:56.766 12778 13111 I python  :    File "/home/seo/Desktop/APP/.buildozer/android/app/main.py", line 598, in calculate
02-17 13:59:56.766 12778 13111 I python  :  ZeroDivisionError: division by zero
02-17 13:59:56.766 12778 13111 I python  : Python for android ended.

Buildozer.spec

requirements = python3==3.11.7,kivy==2.3.0,aiohttp==3.9.3,aiosignal==1.3.1,attrs==23.2.0,beautifulsoup4==4.12.3,certifi==2024.2.2,charset-normalizer==3.3.2,docutils==0.20.1,frozenlist==1.4.1,idna==3.6,multidict==6.0.5,requests==2.31.0,soupsieve==2.5,Unidecode==1.3.8,urllib3==2.2.0,yarl==1.9.4

osx.python_version = 3.11.7
osx.kivy_version = 2.3.0

更新发现问题但无法修复

当我通过 buildozer 创建 APK 时,我检查了 “buildozer android 调试部署运行 logcat” '与 session.get(url, params=querystring, headers=headers) 异步作为响应:' 部分不起作用,里面的 beautifulsoup 也不起作用,所以数据不会被刮掉!我们得到 ZeroDivisionError

但是在VSCODE中没有问题。

为什么 'async with session.get(url, params=querystring, headers=headers) 作为响应:' 部分在 kivy 中不起作用?

谢谢

python python-3.x kivy kivymd buildozer
1个回答
0
投票

首先我检查了

async with session.get(url, params=querystring, headers=headers) as response:
处的错误,因为它没有执行

try:
    async with session.get(url, params=querystring, headers=headers) as response:
        print("mecra")  # Add this line
        soup = BeautifulSoup(await response.text(), "html.parser")
except Exception as e:
    print(f"Exception: {e}")

错误是:

无法连接到主机 .com:443 ssl:True [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:

我从chatgpt获得帮助:

现在我将 ssl 导入到 python 中

新代码

ssl_context = ssl.create_default_context()
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE
async with session.get(url, params=querystring, headers=headers, ssl=ssl_context) as response:

现在

async with session.get(url, params=querystring, headers=headers) as response:
执行并且我的代码可以工作:)

© www.soinside.com 2019 - 2024. All rights reserved.