Windows "Eject USB" Çalışma Mantığı

Merhaba. Python’ta USB’yi bilgisayardan çıkarmakla alakalı bir çalışma yapmak istiyorum ama internetten ne kadar araştırsam da USB’yi bilgisayardan Python’la çıkarmanın bir yolunu bulamadım. Tam olarak Windows’ta USB’yi çıkarmak nasıl işliyor bilgisi olan var mı?

Ben yazınca karşıma ilk sırada bu geldi

Sayfayı okudunuz mu bilmiyorum ama bir çözüm yok içinde.

Evet okudum. İlk yanıtta diyor ki, bunu Windows üzerinde yapmanın kolay ve doğal bir yolu yok. Ama isterseniz Powershell üzerinde Popen kullanarak yapabilirsiniz. Veya pywin32 kütüphanesini araştırın demiş kısaca.

Hatta bir kod örneği de buldum…

1 Beğeni

Merhaba. Yapmak istediğiniz işlem yazılımcıların çok nadiren ihtiyaç duyacağı bir şey. Ayrıca bu şekilde işlemler çoğunlukla C,C++,C# gibi windowsun kütüphane sağladığı veya işletim sistemi ile düşük seviyede iletişim kurabilecek diller tarafından yapılabilir. Bu konuyu internetten araştırırken türkçe bir kaynak bulamamanız çok normal. Dediğim gibi yapmak istediğiniz işlem çok az ihtiyaç duyulacak bir şey. Bu yüzden böyle konularda ingilizce kaynak aramanızı da tavsiye ederim. Ben 10 dakikalık bir araştırmadan sonra github’da bir kod örneği buldum (@coderistan ın attığı ile aynı repo).


Bu örnekten gerekli yerleri alarak şu şekilde bir kod yazdım:

import subprocess
disk = "H"
tmpFile = open('tmp.ps1','w')
tmpFile.write('$driveEject = New-Object -comObject Shell.Application\n')
tmpFile.write('$driveEject.Namespace(17).ParseName("'+disk+':").InvokeVerb("Eject")')
tmpFile.close()
process = subprocess.Popen(['powershell.exe', '-ExecutionPolicy','Unrestricted','./tmp.ps1'])
process.communicate()

Şimdi bu kodla ilgili konuşmak istiyorum. Dediğim gibi python ile işletim sistemi ile çok ayrıntılı işlemleri doğrudan yapmak zor. Bu kod bir WindowsPowerShellScript dosyası açarak daha sonra bu dosyayı çalıştırıyor. Yani ekranda PowerShell uygulaması belirecek. Kod çalıştırıldığında disk değişkenindeki sürücüyü çıkartıyor. Ancak burada bazı eksikler var. Sürücü ile iletişim kesiliyor , yani sürücüde okuma veya yazma işlemleri yapılamıyor, aynı elimizle usb’yi çekmiş gibi. Burada tam da istemediğimiz şekilde çalışan bir yer var o da görev çubuğunun sağ alttaki usb çıkarma bölümünün duruyor olması. Bu sizin için problem oluşturur mu bilmiyorum. Bunun haricinde kod düzgün bir şekilde çalışmaktadır.

2 Beğeni

Çok teşekkürler. Ben de altta belirttiğim kodları bulmuştum ama subprocess modülü hakkında bilgim olmadığı için onu nasıl birleştirebileceğime bakıyordum.

$Eject =  New-Object -comObject Shell.Application
$Eject.NameSpace(17).ParseName("E:").InvokeVerb("Eject")

Ayrı ayrı yazınca hafızada tutmadığı için ilk tanımlanan değişkeni bulamıyordu haliyle. Dosyaya yazmak mantıklıymış. Bunun düşünmemiştim.

Eğer bu problem olacaksa şurada onu da halletmişler sanırım ancak kod C# dili ile yazılmış:
https://www.codeproject.com/Articles/13530/Eject-USB-disks-using-C

Powershell’in inline script calistirma parametresi yok mu? Kodu basitlestirebilir.

Dusuk seviyede iletisim icin ctypes modulunu baya kullanmasi kolay buldum. (Tam olarak ne yapacagini biliyorsan bile ctypes'ta nasil yapilacagini bulmak saati bulabiliyor ama sonucta cikan kod 1 veya 2 fonksiyon cagrisi oluyor.)

Haklısınız. Elbette daha kısa ve mantıklı çözümler bulunabilir ancak dediğiniz gibi biraz uğraşmak gerekiyor. Benim yazdığım çözüm en iyi yol olmayabilir ama en kısa sürede bulduğum yol.