Kivy'de 3. taraf kütüphane kullanma

Haklısınız, sorun çözülememiş de olsa epey yol katettik.

Evet. Sanırım bundan sonraki aşamalardan birisi, artık bir recipe paketinin nasıl bir yapıda olduğunu çözmeye çalışmak ve gerektiğinde bir recipe paketi oluşturmak.

Vakti geldiğinde https bağlantı sıkıntısına da bakacağız. Hayırlı akşamlar :slight_smile:

Konuyla ilgili yeni sonuçlar elde edersem bu başlığı güncellerim. Size de iyi akşamlar dilerim.

Merhaba.

Biraz zaman alsa da, tüm gönderileri okudum. :grinning: Sanırım modüllerin bağımlılıklarını indirmede sorun var. Kivy ya da Buildozer hakkında bilgim yok ama her modülün bağımlılığını ayrı ayrı yazmak ya da indirmeye çalışmak şu zamanda tam bir hamallık. Ki bunla baş edilemez. Çünkü bağımlılıklar iç içe üstel bir şekilde çoğalabilir; her bağımlılığın bir bağımlılığı ve bu bağımlılıkların da bağımlılıkları olabilir. Bu sebeple bir modül yönetim sistemi araştırmanızı tavsiye ederim. Örneğin; requirements.txt diye bir dosyaya yazdığımız pip bağımlılıklarını pip komut satırı aracı ile kurabiliyoruz. Kivy/Buildozer bunu desteklemiyor mu? Desteklemiyor ise desteklenen bir tane bulmak, bulunamadıysa bir tane yapmak olmalı bana göre birincil amaç burada.

İyi çalışmalar.

1 Beğeni

konuyu takipdeyim kendimde araştırıyorum :smiley:

1 Beğeni

Bu örnekle ilgili sorun biraz da, bs4 modülünün bağımlı olduğu modülün (xlml), C kütüphanesine bağımlı olması. Yoksa programa 3. kullanıcılar tarafından yazılmış modülleri import ederken aşağıdaki yöntemi kullanabiliyoruz.

Mesela derlemek istediğimiz program aşağıdaki gibi olsun:

import kivy
kivy.require('1.10.0')
from kivy.app import App
from kivy.uix.label import Label


class MyApp(App):
    def build(self):
        try:
            import html5lib
            sonuc = "html5lib import edildi."
        except:
            sonuc = "html5lib import edilemedi."
        return Label(text=sonuc)


MyApp().run()

Gördüğünüz gibi html5lib modülünü programda kullanmak istiyoruz.

html5lib, tarifi (recipesi) olmayan, 3. kullanıcılar tarafından yazılmış bir modül. Dolayısıyla bunun için .buildozer/android/platform/python-for-android-master/pythonforandroid/recipes dizininde html5lib klasörü ve bunun içinde de __init__.py isimli bir tarif dosyası oluşturulmalı.
html5lib için tarif dosyasını şu şekilde yazdım:

from pythonforandroid.toolchain import Recipe


class html5libRecipe(Recipe):
    version = '0.999999999'
    url = 'https://pypi.python.org/packages/17/ee/99e69cdcefc354e0c18ff2cc60aeeb5bfcc2e33f051bf0cc5526d790c445/html5lib-{version}.tar.gz'
    md5sum = '8578e4e3a341436cb9743a9e4a299239'
    name = 'html5lib'


recipe = html5libRecipe()

Daha sonra buildozer.spec dosyasının requirements kısmına da html5lib’i modül gereksinimi olarak ekledim.

# (list) Application requirements
# comma seperated e.g. requirements = sqlite3,kivy
requirements = html5lib, kivy

requirements kısmına yazılan modüllerin tarif dosyaları yoksa, buraya html5lib yazmak olumlu sonuç vermiyor. Derleme esnasında tarif dosyasının içinde yazılmış olan linkten modül çekiliyor.

Yukarıdaki kivy dosyası derlendi, apk’yi telefona atıp çalıştırdım ve modül import edildi yazısı çıktı.

Ancak her modül için yazılacak tarif dosyası, html5lib için yazılmış olan kadar basit değil. Özellikle bir modül C kütüphanesine ihtiyaç duyuyorsa, derleme esnasında prebuild, postbuild aşamalarında neler yapılması gerektiğini tanımlama ihtiyacı oluşuyor.

bs4 modülü lxml modülüne ihtiyaç duyuyor. lxml bir Python kütüphanesi. lxml de libxml2 ve libxslt isimli C kütüphanelerine ihtiyaç duyuyor. Dolayısıyla libxml2 ve libxslt kütüphaneleri için hazırlanacak tarif dosyaları biraz daha karışık. Hatta kimi kütüphanelerde build aşamasına geçmeden önce bu kütüphaneler patch edilsin diye, tarif dosyalarının yanında bir de patch dosyaları oluşturuluyor.

1 Beğeni

Merhaba.

Peki her alt gereklilik için bir recipe oluşturulmalı mı? Bu recipe’lerin internette tutulduğu ve isteyen tarafından indirilebildiği bir yer yok mu?

Bir de aklıma bir şey geldi. PyPI’deki paketlerin tanımlarından(.wheel dosyalarıyla sağlanıyordu sanırım) recipe’ler oluşturulamaz mı? Sonuçta bu tanımlara bakarak pip bunları kurabiliyor yani kurulmaları için gerekli her şey bu tanımlarda mevcut.

İyi çalışmalar.

1 Beğeni

Anlayabildiğim kadarıyla her gereklilik için bir recipe oluşturulmalı. Mesela şu link, https://github.com/kivy/python-for-android sitesinden fork edilmiş. O linkte yeni recipeler var. Ancak Python-for-android’in orjinal recipe’ler sayfasında ise bu yeni tarifler dahil edilmemiş.

1 Beğeni

Valla İsmail Bey, geçen benim de aklıma geldi ama daha denemedim. Recipelere bakınca indirilen dosyaların tar.gz uzantılı olduğunu gördüm. Yani yaygın olarak tar.gz dosyaları indiriliyor. wheel çalışır mı emin değilim, ama denenebilir.

1 Beğeni

Bu arada, bs4 recipelerini yazan arkadaştan mail geldi:

Hi,
The thing is, I have not touched this thing for like 9-10 months.

But I would love to help you …
Following are a few things you can try

  1. Recompile the application and share the compilation logs using gist or pastebin with inclement on #kivy or #kivy-dev on irc.
  2. Maybe retry again by cloning latest p4a repo and personally add the recipe files at their places as specified in the PR on github.
  3. Ask inclement for help.
  4. And if nothing above works use p4a’s old_toolchain to compile your code. I can assure you it would at least compile fully(If they have not made some changes recently that affects it) and would give you an app that doesn’t run :p.

Let me know if that helps.
Good Luck

Not: inclement, kivy ile ilgilenen bir programcının kullandığı nickname. Daha önce kivy’de yaşadığım bir sorunda yardımı dokunmuştu.

1 Beğeni

Yani kısaca demek istiyor ki, ben uzun zamandır bununla ilgilenmiyorum, sorun için irc kanallarına başvurabilirsiniz. Yada inclement denen arkadaşa sorun. Veyahut p4a old_toolchain ile derleyin gibi birşey ??

Ben bu kadarını anladım. Tabi sonuç olarak inclement denen arkadaşa tekrar dönüyor :slight_smile:

Aslında, p4a dökümanda yazmışki, “eğer bir kütüphane tarif dosyasına sahip değilse, biz sizin için onu pip yardımı ile indirir derleriz, ekleriz” demiş ama, malesef bunu tam olarak yapamıyor

Aynen öyle. inclement nickli arkadaşı bulabiliriz. Konuyu stackoverflow’a taşırız, mesajın başına bir @inclement ekleriz. O aktif olduğunda mesaj kutusu renklenir. Vakit bulduğunda da, isterse konuyla ilgili geri dönüş yapar.

1 Beğeni

Olabilir. Güzel olur faydalanırız

Konu hakkında bir güncelleme yapmak istiyorum. Https bağlantısını sağlamak için, öncelikle requirements kısmına openssl eklemek gerekiyor. Daha sonra, kendim kullanırken sorun yaşamadığım, python urllib2 kütüphanesi ile https sitelere bağlantı yapabiliyorum.

Recipe kısmına gelince, yukarıda gördüğünüz gibi p4a geliştiricileri tarafından yazılmamış, ancak size gerekli olan 3. part bir kütüphane varsa, recipe oluşturmayı öğrenmek gerekiyor. Olay bu kadar :slight_smile: Herkese başarılar dilerim…

2 Beğeni

kivy ile requests modulunu kullanabiliyorduk degik mi henuz deneme sansim olmadi ama

1 Beğeni

Evet kullanılabiliyor. requirements kısmına requests eklerseniz, otomatik olarak projeye eklenir.

öncelikle geç olsun güç olmasın konuya 5 sene olmuş :smiley:

hocam ben hiç bs4 le uğraşmadan parçalama yapmaya çalıştım kodumda bir siteden veri çekmem gerekiyordu tamamen standart kütüphanelere bağlı kalarak parçalama işlemi yaptığım kodu paylaşmak isterim

import urllib.request as istek

veri = istek.urlopen(“JustPaste.it - Share Text & Images the Easy Way”)
veri2 = “”
for i in veri:
veri2+=str(i)

a = veri2.split("burdaki p tagını yazbel form html kodu gibi algılıyor sanki boşluk atmışm gibi gözüküyor ")
sunucu = a[0][-23:]

if sunucu == “sunucu_kapalı”:
print(“Sunucuyla İletişim Kurulamadı!”)
else:
sunucu = sunucu.text.split(":")
print(int(sunucu[1]))

merak edenler için mobil chat uygulamamda geçici ama kalıcı sunucu açmak için yaptığım kod
ücretsiz ngrok sunucusu açıp sadece juspaste sitesindeki texti güncelliyorum yanlışlıkla kapatılan (laptopun şarjı, internet kesintisi durumları vs) her yeni açtığım ngrok sunucusunda apk yı güncellememe gerek kalmıyor zaten kod, sunucuyu koyacağım justÖnceden biçimlendirilmiş yazıpaste sitesini kazıp bağlantı kuruyor