Merhaba…
Önceki konularımda(1,2) güncelleme ile ilgili kafanızın etini yemiş olabilirim. Onun için kusura bakmayın 
Şimdi yüzdüm yüzdüm kuyruğuna geldim. Geldim gelmesine ama, gıcık bir hata ile karşılaştım(hata bile denmeyebilir). Ufak bir örnekle izah edeyim:
versiyon = "0.1.0"
versiyon2 = "0.1.0"
if versiyon != versiyon2:
print("güncelleme var")
elif versiyon == versiyon2:
print("Güncel")
Üstte de gördünüz gibi bir örnek yaptığımda bana Güncel
çıktısını veriyor. Tamam bunda hepimiz hemfikiriz…
Geliyorum şimdi asıl sorunuma:
from urllib.request import urlopen
def update():
guncel_url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/guncel_url.py"
versiyon_url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/version.txt"
__version__ = "0.1.0"
url1 = urlopen(url=guncel_url)
url2 = urlopen(url=versiyon_url)
if __version__ != url2:
print("güncel değil\nGüncelleştiriliyor")
with open("eski.py", "wb") as f:
for i in url1:
f.write(i)
elif __version__ == url2:
print("Zaten Güncel")
update()
Burda yazdığıma göre __version__
adlı değişken url2
adlı değişkene eşit değil ise güncelle(buraya kadar her şey çok güzel), eşitse Zaten Güncel
yazısını ekrana yazdırmak. İşte sorunda tam burada oluyor. elif __version__ == url2:
bloğu sanki es geçilmiş gibi oluyor ve __version__ == url2
olsa dahi okumadan tekrardan eşit değilmişcesine güncelleme işlemini yapıyor. Bunu nasıl çözebilirim.
(versiyon_url’nin linkini koyuyorum orada da görebilirsiniz ki __version__
ile yazılan numaralar aynı)
Teşekkür ediyorum şimdiden…
url2’nin çıktısı nasıl oluyor onu yazabilir misin? Ve de type(url2) == type(__Version__)
onu da bir kontrol edebilir misin?
sırasıyla
print(url2)
print(type(url2))
print(type(__version__))
<http.client.HTTPResponse object at 0x00000296CCA6A520>
<class 'http.client.HTTPResponse'>
<class 'str'
burada demek istediğiniz sanırım şu:
if type(url2) == type(__version__):
return True
else:
return False
Bunun sonucu ekranda herhangi bir belirti olmuyor
$ python
Python 3.9.2 (default, Feb 20 2021, 18:40:11)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from urllib.request import urlopen
>>> url = urlopen(url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/version.txt")
>>> version1 = url.read()
>>> version1
b'0.1.0\n'
>>> version2 = b'0.1.0\n'
>>> version1 == version2
True
>>>
Merhaba, yukarıdaki gibi yaparsan sanırım amacına ulaşmış olursun diye düşünüyorum.
Kaynak
İkinci olarak söylemek istediğim bir şey daha var. Eğer if else bloglarında mantık hatası olduğunu falan düşünüyorsan (hatta bazen düşünmüyorsan bile) @Gok_Mavisi_Anka nın cevapta yazdığı gibi kodunu print ile falan debug edebilirsin. Çok işe yarar 
1 Beğeni
hocam dediğiniz yöntemi yaptım gayet güzel fakat bu sefer
__version__ = b'0.1.0\n'
olunca yani linkteki ile aynı sayı olduğunda None yazıyor
ekranda.
Şöyle toparlayıp sizin gösterdiğiniz şekilde yazdığımda:
from urllib.request import urlopen
def update():
guncel_url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/guncel_url.py"
versiyon_url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/version.txt"
__version__ = b'0.1.0\n' # gösterdiğiniz gibi yaptığım kısım 1
url1 = urlopen(url=guncel_url)
url2 = urlopen(url=versiyon_url)
if __version__ == url2: # __version__ ile aynı olduğunda print olarak "Güncel" yazmalı fakat yazmıyor ve de güncellemiyor
print("Güncel")
elif __version__ < url2.read(): # gösterdiğiniz gibi yaptığım kısım 2
print("güncel değil\nGüncelleştiriliyor")
with open("eski.py", "wb") as f:
for i in url1:
f.write(i)
print(update())
print(update())
None
Sadece if
bloğunda belirttiğim sorun kaldı hocam Güncellememesi gerek evet o gayet iyi oluyor fakat ekrana neden yazmıyor
if bloguna dikkatlice bak url2.read()
yerine url2
yazmışsın.
version2 = url2.read()
if version == version2:
…
else:
…
Şeklinde olursa daha okunaklı olur bence.
2 Beğeni
hahahahaaaa kusuruma bakmayınnn… Çok teşekkür ederim zaman ayırıp emek verdiğiniz için…
1 Beğeni
Estağfurullah ben teşekkür ederim. İyi çalışmalar
ya hocam versiyonu değiştirince yine none diyor ne yapmalıyım acaba
Çünkü read iki kere çalışınca boş byte dönüyor. Oradaki read methodunu dosya okuma gibi düşün. Birinci read de tüm içeriği okuyor ve tabiri caizse dosya imleci sona geliyor. İkinci read çalıştığında ise o imlecin ilerisinde okuyacak bir şey bulamıyor.
1 Beğeni
Fonksiyonda herhangi bir return
ifadesi olmadığından dolaylı olarak None
döndürülüyor. Siz de print(update())
dediğinizde fonksiyonun döndürdüğü None
değerini yazdırıyorsunuz (yani print(None)
'a denk geliyor; fonksiyonun sonuna return 8
yazarsanız da 8 görülür ekranda).
1 - print(update())
ile amacınız tam olarak nedir: print
ile return
farklı amaçlara hizmet ediyorlar onu belirtmek gerekir.
2 - Yukarıda bahsedilen read
'i ardı ardına çağırmamayı hesaba kattınız mı, kodunuzun son halini buraya aktarmanız mümkün müdür? read
'in döndürdüğünü bir değişkene atıyor ve öyle kontrol ediyorsunuz değil mi? (İlk read
'den sonra boş byte dönüyor.)
3 - Opsiyonel olarak read
'in döndürdüğü bytes objesini .decode()
ile string’e dönüştürebilirsiniz (manipüle etmesi daha doğal diye düşündüm binary veri değil de tekst verisi diye). Daha da opsiyonel olan ardına rstrip("\n")
atarak olası sayfa sonu yeni-satırından kurtulmaktır. Bunlar sonrası karşılaştırma __version__ == "0.1.0"
diye yapılabilir.
1 Beğeni
Ben gitmiş None dönüyor demişim yanlışlıkla, kasteddiğim buydu, düzeltmen için eyvallah(düzelttim
), koda üstünkörü bakınca oradaki printi görememişim. Teşekkürler
1 Beğeni