Komuttan çıkan çıktıyı gizleme

Aşağıdaki kodda wifi var mı yok mu diye bakıyorum ama ping kullanarak yapınca ping çıktıları veriyor bunu nasıl engelleyebilirim?

import os, sys
wifi_b = str(os.system("ping google.com"))


if wifi_b.endswith('0'):
    print(":)")
else:
    print(";(")

Komuttan çıkan çıktının ekrana yazdırılmamasını istiyorsanız, subprocess modülünün Popen sınıfını kullanmanız gerekir.

Ayrıca aşağıdaki kodlarla da bir ağa bağlı olup olmadığınızı sorgulayabilirsiniz.

from urllib import request

try:
    request.urlopen("https://www.google.com")
    print("Bağlantı var.")
except:
    print("Bağlantı yok.")

Aynen. Baska program calistirmali isler icin her zaman ilk dayanak subprocess standart modulu olmali.

Ama tabi os.system ile calistirilan programi susturmak da bir opsiyon:

os.system("ping google.com > /dev/null")
2 Likes

Sayenizde yeni bir şey öğrenmiş oldum. :slight_smile:

1 Like

Bir de arkadaşın yazdığı kodlarla ilgili şöyle bir durum var. ping google.com ifadesinde kaç tane ping gönderileceği belli değil. Ping komutunun -c diye bir argümanı var. count anlamına geliyor. Kullanımı ise şu şekilde:

os.system("ping google.com -c 1 > /dev/null")

Yukarıdaki koda göre 1 tane ping isteği (request) gönderilir ve 1 tane yanıt (response) alınır.

Yani bir ağa bağlı olup olmadığınızı kontrol etmek için sadece 1 tane ping göndermeniz yeterli olur. Kodlarınızı da şu şekilde değiştirmeniz gerekiyor.

import os
wifi_b = str(os.system("ping google.com -c 1 > /dev/null"))

if wifi_b == "0":
    print(":)")
else:
    print(";(")

veya subprocess modülünü kullanarak şöyle de yapabilirsiniz:

import subprocess
wifi_b = subprocess.Popen(
    ["ping", "google.com", "-c", "1"], 
    stdout=subprocess.PIPE
).communicate()[0].decode("utf-8")
print(wifi_b)

Bu arada os.system kullandığınızda 0 sayısı veya bir hata durumunda başka bir sayı return edilir. Siz de zaten bu 0 sayısının return edilip edilmemesine göre bir ağa bağlı olup olmadığınızı sorguluyorsunuz. Ancak subprocess kullanırken, ağa bağlı olup olmadığınızı daha farklı bir yol izleyerek kontrol etmeniz gerekecektir. Mesela çıktılar arasındaki farka göre herhangi bir ağa bağlı olup olmadığınızı sorgulayabilirsiniz.

Veya urllib gibi, çalışması için bir ağa bağlı olmayı gerektiren kütüphanelerden birini de kullanabilirsiniz. Tercih size kalmış.

1 Like

Android’de wifi için bir modül var. Sisteme özgü bir internet modülü bulunamaz mı?

Bağlantı olup olmadığını kontrol etmek için, internet olduğu sürece çalışan herhangi bir modül kullanılabilir. Bağlantı yoksa zaten bu modüller otomatik olarak bir hata yükseltecektir.

Bu da bir yöntem elbette ancak işi sadece internet bağlantısı var mı yok mu diye kontrol eden bir modül daha doğru bir yol değil mi?
Bu tarz bir yöntemle değil de işletim sistemini kullanarak yapan bir modül.

İnternet bağlantısının olup olmadığını kontrol etmek o kadar zor değil ki, bunun için bir modül oluşturulsun. Yani birçok modülü bu amaç için kullanabiliriz. Sadece özel olarak bu iş için bir modül tasarlamak bence gerekli değil.

az calisan ve yaniti kisa olan bir sitede denemek en kotu baglantiyi bile kisa surede tespit edebilmenizi saglar. (İcime dogdu, @aib cevap verecek. :slight_smile: )

http://ident.me

Peki deneme-yanilma disinda bir yontem yok mu?

Siteye istek atmadan size veri verip veremiyeceğini nasıl anlayabiliriz ?

Deneme yanılma yapmıyoruz ki, internetin olup olmadığını en basit şekilde kontrol ediyoruz, hepsi bu.

Bu kodu uyguladığımda

Sistem belirtilen yolu bulamıyor.

diye hata veriyor

Galiba verdiğiniz konum windows için değil o yüzden çalışmıyor bence.

O zaman subprocess modülünü kullanmayı deneyin.

Access denied. Option -c requires administrative privileges.

Böyle hata veriyor.

cmd.exe’yi yönetici olarak çalıştırmayı deneyin.

Bu arada aşağıdaki yöntemi de deneyebilirsiniz:

from urllib import request

try:
    request.urlopen("https://ident.me")
    print("Bağlantı var.")
except:
    print("Bağlantı yok.")

Ping çıktıları veriyo şimdi.

Bu çalıştı.

Sart degil, subprocess'te de exit status donduren milyonlarca sey var. (returncode aratiniz)

1 Like