Python ile Harici Ekran Kartının Durumunu Değiştirme

Python programlama dili hakkında bilgiler, kaynaklar, dokümanlar ve örneklerin bulunduğu bölümümüz.
Cevapla
trasmus
ARGE Ekip Üyesi
ARGE Ekip Üyesi
Mesajlar: 66
Kayıt: 28 Eyl 2023 14:47
Teşekkür etti: 25 kez
Teşekkür edildi: 72 kez

Python ile Harici Ekran Kartının Durumunu Değiştirme

Mesaj gönderen trasmus »

Programın adı: Gpu_durum_değiştirici

Gui var mı: Şuanda yok. Program çalıştırıldığında açılan komut penceresinden bilgi veriyor. İşi bittiğinde 5 saniye sonra kapanır.

Yetki yükseltmesi istiyor mu: Evet, sistemdeki bir bileşenin durumunu değiştirdiği için yönetici yetkisini mecburen istiyor. Yönetici yetkisi olmadan çalıştırıldığında komut penceresinden sizi uyarır.

İşlevi: Şuan için sisteminizdeki Nvidia ekran kartının durumuna göre aygıtı açma veya kapatmayı otomatik yapıyor.

Github Adresi: Şimdilik Github'a koymayacağım. Bir hafta kadar kullanıcılardan gelen bilgilere göre düzeltip yayınlarım.

Sorumluluk Reddi: Bu program kişisel bir amaç için geliştirilmiştir. Kullanımından doğan herhangi bir sorundan dolayı scriptin sahibi sorumlu tutulamaz.

Not: Karşılaştığınız hatalar varsa konu altına yazın düzeltmeye çalışacağım. Program Amd ekran kartlarına da uyarlanabilir ancak bende böyle bir pc olmadığından ekleme yapamadım.

Exe adresi: https://disk.yandex.com.tr/d/QG-oQDTy3JMLNQ
SHA3-512: 89AF776D939447499365B3A68D9803556511BFF2225BC82E4407F8EDF5403F45C6F7C6738FCEE798985138D56C5C77924C4555058F854941EAC5A856D5DD2728

Python kodu:

Kod: Tümünü seç

import subprocess
from time import sleep as uyu

def bilgiAl():
    sorgu = subprocess.check_output('pnputil /enum-devices /class Display')
    tespit = sorgu.decode("ansi", errors="replace").split('\r\n\r\n')
    for i in tespit:
        sor = i.find('NVIDIA')
        if sor != -1:
            isim  =  i.split('\r\n')[1].replace("  ","")
            durum = i.split('\r\n')[5].replace("  ","")
            adres = i.split('\r\n')[0].replace("  ","")
            print(  f"\r\n-----Bilgi-----------\r\n{isim}\r\n{adres}\r\n{durum}" )
            return([durum.split(": ")[1] , adres.split(":")[1] ] )

def kapat(id):
    kapat = subprocess.check_output(f'pnputil /disable-device {id}')
    bilgi = (kapat.decode('ANSI', errors='replace'))
    print("--------------------\r\n\r\n----Kapat-----------")
    if bilgi.find("Erişim engellendi.") != -1:
        print("Uyarı! " + bilgi.splitlines()[3] + " Admin Yetkisi Gerekli!")
    elif bilgi.find("Device disabled successfully.") != -1:
        print( "Kapatma İşlemi Başarılı.\r\n" + bilgi.splitlines()[3] + "\r\n--------------------\r\n" )
    uyu(5)

def ac(id):
    ac = subprocess.check_output(f'pnputil /enable-device {id}')
    bilgi = (ac.decode('ANSI', errors='replace'))
    print("--------------------\r\n\r\n-----Aç-------------")
    if bilgi.find("Erişim engellendi.") != -1:
        print("Uyarı! " + bilgi.splitlines()[3] + " Admin Yetkisi Gerekli!")
    elif bilgi.find("Device enabled successfully.") != -1:
        print( "Açma İşlemi Başarılı.\r\n" + bilgi.splitlines()[3] + "\r\n--------------------\r\n" )
    uyu(5)

durum = bilgiAl()

if durum[0] == "Started":
    kapat(durum[1])
elif durum[0] == "Disabled":
    ac(durum[1])

Etiketler:
Kullanıcı avatarı
admin
Sistem Geliştiricisi
Sistem Geliştiricisi
Mesajlar: 1139
Kayıt: 28 Ağu 2022 04:38
Konum: Database
Meslek: Teknisyen
Teşekkür etti: 819 kez
Teşekkür edildi: 604 kez
İletişim:

Re: Python ile Harici Ekran Kartının Durumunu Değiştirme

Mesaj gönderen admin »

Selam.

Şimdi benim laptop da intel iris onboard ve nvidia 3050ti var. Bu uygulama 3050 ti kapatmaya mı yarıyor? Bir ara linux ta optimus vardı onun gibi bir şey mi?

Bazı laptoplarda eskiden manuel onboard-harici arası tuşla geçiş vardı. bu onu yazılımsal olarak mı yapıyor.

eline sağlık
Daha zeki olmanın tek yolu, daha zeki bir rakiple oynamaktır.
trasmus
ARGE Ekip Üyesi
ARGE Ekip Üyesi
Mesajlar: 66
Kayıt: 28 Eyl 2023 14:47
Teşekkür etti: 25 kez
Teşekkür edildi: 72 kez

Re: Python ile Harici Ekran Kartının Durumunu Değiştirme

Mesaj gönderen trasmus »

Program aygıt yöneticisinden nvidia görüntü bağdaştırıcısını devre dışı bırakıyor.
Kullanıcı avatarı
TRWE_2012
Mesaj Panosu Yöneticisi
Mesaj Panosu Yöneticisi
Mesajlar: 887
Kayıt: 30 Ağu 2022 21:59
Konum: DÜZCE/Akçakoca
Meslek: MADEN MÜHENDİSİ
Teşekkür etti: 239 kez
Teşekkür edildi: 733 kez
İletişim:

Re: Python ile Harici Ekran Kartının Durumunu Değiştirme

Mesaj gönderen TRWE_2012 »

GÜNCELLEME :

Neden Güncellendi ?

subprocess.check_output() kullanımı:

Eğer pnputil komutu başarısız olursa, betik hata verip çöker. Bunun yerine try-except bloğu kullanarak hata yakalama eklenmeliydi.
subprocess.check_output() doğrudan çıktıyı alır, ancak bazı durumlarda subprocess.run() kullanarak çıktıyı kontrol etmek daha güvenli olabilir.

pnputil /disable-device ve pnputil /enable-device komutlarının çalıştırılması için yönetici yetkisi gerekebilir. Betik, bu yetkinin olup olmadığını kontrol etmiyor.Yönetici yetkisi olmadan çalıştırılırsa hata verebilir, ancak bu hatayı düzgün ele almıyor.

Çoğu Windows sisteminde ANSI yerine cp1254 (Türkçe Windows) veya utf-8 kullanmakta...
"replace" hatalı karakterleri ? ile değiştirir, bunun yerine "ignore" veya "strict" kullanmak daha iyidir.

pnputil çıktısında her satırın yapısı değişebilir, farklı Windows sürümlerinde farklı formatta gelebilme ihtimali var.
find("NVIDIA") yerine daha sağlam bir regex (re.search(r"NVIDIA", i, re.IGNORECASE)) yapısı uygundur.
isim, durum ve adres bölümleri dinamik olarak tespit edilmeliydi, çünkü satır sayıları farklı olabilme durumu da var.

kapat(id) ve ac(id) fonksiyonları işlem sonucunu geri döndürmeli, böylece çağıran kod buna göre hareket edebilme özelliği kazanır.

Eğer hiçbir NVIDIA cihazı bulunamazsa, return yapılmadığı için durum = bilgiAl() çağrısı sonrası durum[0] çalıştırılmaya çalışılırken hata alınır (TypeError: 'NoneType' object is not subscriptable).Eğer NVIDIA cihazı yoksa fonksiyon None döndürmeli ve çağıran kod bunu kontrol edebilmeli özellikte olmalıdır.

Güncelleştirilmiş Kod İçeriği :

Kod: Tümünü seç

import subprocess
import re
from time import sleep as uyu

def bilgiAl():
    try:
        sorgu = subprocess.check_output('pnputil /enum-devices /class Display', encoding="cp1254", errors="ignore")
    except subprocess.CalledProcessError as e:
        print("Hata: `pnputil` komutu çalıştırılamadı!")
        return None

    tespit = sorgu.split('\r\n\r\n')
    for i in tespit:
        if re.search(r"NVIDIA", i, re.IGNORECASE):
            satirlar = i.split('\r\n')
            isim  = next((s for s in satirlar if "Name:" in s), "Name: Bilinmiyor").split(":")[1].strip()
            durum = next((s for s in satirlar if "Status:" in s), "Status: Bilinmiyor").split(":")[1].strip()
            adres = next((s for s in satirlar if "Instance ID:" in s), "Instance ID: Bilinmiyor").split(":")[1].strip()
            
            print(f"\n----- Bilgi ----------\n{isim}\n{adres}\n{durum}")
            return [durum, adres]

    print("NVIDIA cihazı bulunamadı.")
    return None

def kapat(id):
    try:
        kapat = subprocess.run(f'pnputil /disable-device {id}', capture_output=True, encoding="cp1254", errors="ignore")
        bilgi = kapat.stdout
        print("\n---- Kapat -----------")
        
        if "Erişim engellendi" in bilgi:
            print("Uyarı! Admin yetkisi gerekli!")
            return False
        elif "Device disabled successfully" in bilgi:
            print("Kapatma işlemi başarılı.")
            return True

    except subprocess.CalledProcessError:
        print("Cihaz kapatma başarısız!")
    return False

def ac(id):
    try:
        ac = subprocess.run(f'pnputil /enable-device {id}', capture_output=True, encoding="cp1254", errors="ignore")
        bilgi = ac.stdout
        print("\n----- Aç -------------")
        
        if "Erişim engellendi" in bilgi:
            print("Uyarı! Admin yetkisi gerekli!")
            return False
        elif "Device enabled successfully" in bilgi:
            print("Açma işlemi başarılı.")
            return True

    except subprocess.CalledProcessError:
        print("Cihaz açma başarısız!")
    return False

durum = bilgiAl()

if durum:
    if durum[0] == "Started":
        kapat(durum[1])
    elif durum[0] == "Disabled":
        ac(durum[1])
else:
    print("İşlem yapılamadı.")
SONUÇ OLARAK :

Hata yakalama (try-except) eklendi: subprocess.check_output() ve subprocess.run() hatalarını düzgün yönetir.
Windows yönetici yetkisi kontrolü eklendi: Eğer yetki yoksa uyarı veriyor.
Kodlama formatı cp1254 olarak değiştirildi: Türkçe Windows sistemlerinde uyumluluk artırıldı.
Çıktıyı daha sağlam parçalama eklendi: Regex (re.search()) ve next() ile güvenilir veri çekme sağlandı.
None kontrolü eklendi: Eğer bilgiAl() fonksiyonu bir şey bulamazsa, None döndürüp programın çökmesini önler.
Geri dönüş değerleri (return) eklendi: kapat() ve ac() fonksiyonları işlemin başarılı olup olmadığını döndürüyor.

NOT:

Her iki kodlamayı bir karşılaştırma yazılımı ile kontrol edilirse, kodlama da nelerin değiştirildiği kolayca görülebilir...

Ve Teşekkürler..Eline klavyene ve gözlerine sağlık....Kendi not defterime kattım py kodlamanı...
Verily We have granted thee a manifest Victory
Fetih Suresi - 1.Ayet


Resim
Resim
Cevapla

“Python Programlama” sayfasına dön