Python script çalışan terminali kapatma

Merhaba,
Python scriptimi windows 10 üzerinde cmd terminalde çalıştırıyorum scriptte belirli bir durumla karşılaştığımda açık olan terminalin tamamen kapatılmasını istiyorum. Bunu pid alarak yapmayı denedim ama terminal üzerinde sadece python.exe’nin pidini aldı ve python.exe yi sonlandırdı script çalışmayı durdurdu ancak terminal açık kaldı. Aynı anda birden fazla terminal çalıştırdığım için herhangi bir cmd.exe’yi de kapatamam sadece yazdığım kod bloğu çalıştığında açık olan scriptin çalışmayı durdurup kendi çalıştığı terminali kapatmasını istiyorum, bunu nasıl yapabilirim? Yardımcı olursanız çok sevinirim teşekkürler.

Merhaba.

Şuradaki ilk iki fonksiyon çağrısı Windows’ta konsol ekranını kapatıyor:

1 Beğeni

@EkremDincel Merhaba Ekrem bey, cevabınız için teşekkür ederim. Denedim ancak hata alıyorum,

NameError: name ‘Win32gui’ is not defined

win32gui kurulu.

@EkremDincel sorunu buldum düzelttim cevabınız için teşekkür ederim ancak bu kod sanırım sadece terminalin görünmesini engelliyor arkaplanda çalışmaya devam ediyor. Bunu pid numarasını takip ederek fark ettim. Deneyebileceğim farklı bir şey var mı acaba?

Terminali niçin tamamen kapatmak istiyorsunuz ki?

Kapatabilir misiniz ondan da emin değilim, elle kapatmaya çalışınca şöyle bir uyarı veriyor:

Nasil calistiriyorsun?

Bu terminalin gorevi, python’a yukleme.

Nasil denedin?

Bu cumlenin oznesi yok. Kim aliyor? Nasil aliyor?

Python’dan almaya mi calisiyorsun? Terminalin vermesi daha dogru. (Ama hala yanlis, bakiniz yukaridaki ikinci cumlem)


Kullandigin terminali, shell’i ve python’i calistiran betigi de yazman lazim.

1 Beğeni

@EkremDincel Script belirlediğim durumla karşılaştığında terminali tamamen kapattırıp tekrar açtırmak istiyorum, açtırma kısmında sorun yok ancak kapatmada sorun yaşıyorum aynı anda yaklaşık 30 terminalde bu işlemi yaptıracağım. Bu yüzden günlük yaklaşık olarak 1000-1500 defa terminal açacak bu kadar terminal bilgisayarda açık kalınca bilgisayar tamamen donuyor bunun önüne geçmek için hata aldığım terminali kapattırmak istiyorum. Evet işlemler kısmında elle kapatmak istersek bu uyarıyı alıyoruz ama ayrıntılar kısmından kapatabiliyoruz.

@aib
os.getpid() ile kendi scriptim üstünden çalışan terminalin pid değerini almayı denedim ama bana python’un pid değerini verdi kapattığımda da python.exe kapandı script çalışmayı durdurdu ama terminal açık kalmaya devam etti. Ben kısaca script belirlediğim durumla karşılaştığında manuel olarak terminalde X butonuna basar gibi kapatarak hem o terminalin hem de scriptin işlemini bilgisayardan tamamen kapatmak istiyorum.

Aynı terminali kullanmaya devam etmenizi engelleyen ne?

Terminallerden hata mı alıyorsunuz? Ne hatası?

Çalıştırdığım script internet gerektiriyor çok fazla database işlemi yapıyor hata aldıktan sonra aynı terminal üzerinde çalıştırırsam scriptte bazen buglar oluyor, hata vermeden çalışmayı durduruyor yada script tam açılacakken yüklenme kısmında donuyor ve ilerlemiyor. Bu durumlarda hata vermediği için de tekrar başlatmayı deneyemiyorum. Bu yüzden en sağlıklı çözümün yeni terminal açtırıp eskisini kapatmak olduğunu düşündüm. Terminalde hata almıyorum terminal üzerinde çalışan scriptte hata aldığımda terminali kapatmak istiyorum.

Sorularimin sadece birine cevap vermissin, sundugum daha dogru olan iki alternatifle ilgili yorum yapmamissin. Soyleyecegim baska bir sey yok, sadece konusma havada kalmasin diye yaziyorum.

Dikkatli okursanız tüm sorularınızın cevabı olduğunu görürsünüz nasıl çalıştırıyorsun? sorusu dışında pythonu terminalde nasıl çalıştırdığımı sormuşsunuz bunu bildiğinizi düşünüyorum.Kullandığım terminali shelli ve python çalıştıran betiği istemişsiniz. windows 10da cmd ile çalıştırdığımı belirtmişim. yazmış olduğum python betiğine neden ihtiyacınız var? bu işlem benim koduma özel olarak yapılmayacak sonuçta yapılabilen bir işlemse herhangi bir kod bloğu çalıştığında yapmak istediğim şey de çalışacaktır bu yüzden yazdığım kodu paylaşmaya gerek duymadım. Terminal üstünde çalışan python script ile pid değerini aldığımı bu sebeple sadece python.exe nin pid değerini bana verdiğini ve bunu sonlandırdığımda python scriptin durduğunu ancak terminalin açık kalmaya devam ettiğini açık kalan terminalin pid değerini alamadığımı söylemişim size. Tam olarak hangi sorunuz cevapsız kalmış?

Python scriptini Windows 10 uzerinde cmd.exe’de nasil calistiriyorsun? Kullandigin bir takim BAT veya py uzantili dosyalar var mi? Icerikleri neler? Bize kod goster.

getpid cagiran process’in ID’sini verir, getppid mi demek istedin?

Bilseydim sormazdim. Bunu yapmanin tek bir yolu oldugunu ve bu yolun sizin yaptiginiz yol oldugunu dusunuyorsunuz ama yaniliyorsunuz.

Hatta cozumlerin bir kismi (daha dogru olanlari) dogrudan alternatif yollardan geciyor.

Ihtiyacimiz yok. Ama problemin cozulmesine de ihtiyacimiz yok.

Hatta neden ihtiyacimiz oldugunu izah etmeye bile ihtiyacimiz yok, ama yazayim:

  1. Harcadigim(iz) zamana degecek biri/bir kod oldugundan emin olmak. Butun bunlar 2 satirlik bir python programi icin veya “haXX0ReD by dimit” yazdirmak icin yapiliyorsa ugrasmak istemeyenler cikar.
  2. Aciklayamadiginiz bilgileri almak icin. Mesela oradaki “getpid” typo mu yoksa hakkaten bir alt satirdaki "getppid"i gormediniz mi bilmiyoruz. Veya process agac yapisini bilmiyor gozukuyorsunuz, ama terminalin PID’ini almaya calisan bir shell betigi veya agaci tarayan bir python kodu, bu goruntu yanlissa duzeltir.

…ve problemi cozmeye harcayacagim enerji problemi neden kendi sartlarimla cozmek istedigimi aciklamaya gitsin.

Herhangi bir dosya yok, windows 10 arama çubuğuna cmd.exe yazıp scriptin kurulu olduğu dizine gidip scripti başlatma komutunu giriyorum.

Hayır getpid kullandım benim de ihtiyacım olan şey process id almak bu yüzden getpid kullandım, ancak yukarıda da belirttiğim gibi python.exe’ nin pid değerini aldığı için cmd.exe’yi kapatamadım.

Bu sorunun farklı çalışma şekilleriyle alakası olmadığını düşünüyorum bat ile de çalıştırsam subprocess de kullansam sonuçta bana terminal açıyor her şekilde bu terminali kapatmam gerekiyor.

Beni yanlış anlamayın ve kibirli olduğumu düşünmeyin lütfen, zamanında 10.000$ dan fazla masraf ederek 3 ayda hazırlattığımız yaklaşık 380 python dosyasından oluşan bir proje. Bu yüzden gerekli olmadıkça kimseyle kod paylaşımı yapmak istemiyorum.
Burası bir yardımlaşma forumu diye biliyordum, bu durumda eğer insanların sorunlarına yardım etmek için harcadığınız zamanın boşa gideceğini düşünüyorsanız kimseye yardımcı olmamanız sizin için daha iyi olur. Ben python bilmiyorum kendi imkanlarımla zamanında yaptırdığımız bu projeyi yayınlamak için eksik gördüğüm basit şeyleri kendim düzeltmeye çalışıyorum bu kadar büyük bir sorun olduğunu düşünmediğim için buraya konu açmak istedim. Vaktinizi aldığım için kusura bakmayın, yardım etmeye çalıştığınız için teşekkürler iyi günler dilerim.

1 Beğeni

Karsilastigimiz insanlarin cogunlugundan dolayi varsaydigim kibir icin ozur dilerim o zaman.

Bu tur detaylar problemin, ve haliyle olasi cozumlerin scope’larini netlestiriyor. Ornegin:

  • Bu program kendi calistiricisini veya cmd.exe’den daha iyi bir arayuzu hak ediyor
  • Ama muhtemelen buna kaynak kalmamis
  • Programi calistirip terminali kapatmakla sorumlu 381. dosya hala daha dogru bir cozum
  • Ama muhtemelen buna da kaynak yok
  • Soruyu soranin python ogrenme derdi yok, teknik becerisi yuksek
  • O zaman “hacky” (=gunu kurtaran veya ideal olmayan) cozumler muhtemelen okey

getppid de process ID donduruyor. getpid’den farki, cagiran process’in (python.exe) degil, parent’inin (cmd.exe) ID’sini dondurmesi.

3 Beğeni
from tkinter import filedialog
from tkinter import Tk
from os import system
from sys import exit

root = Tk()
root.filename =  filedialog.askopenfilename(initialdir = "/",title = "Select file",
                filetypes = (("python files","*.py"),("all files","*.*")))

if root.filename == "":
    exit()

system('python ' + root.filename)

kodları pyinstaller kullanarak --windowed parametresi ile derleyebilirsiniz daha basit olsun isterseniz auto-py-to-exe kullanabilirsiniz.

1 Beğeni

ppid = os.getppid()
pid = os.getpid()
subprocess.check_output(“Taskkill /PID %d /F” % ppid)
subprocess.check_output(“Taskkill /PID %d /F” % pid)

@aib Çok teşekkür ederim, verdiğiniz bilgi ile biraz araştırma yaparak bu şekilde sorunumu çözdüm. Yardımcı olduğunuz için çok sağ olun. Beni büyük bir yükten kurtardınız.

@sefaturker Maalesef verdiğiniz kodu deneme imkanım olmadı. Yardım ettiğiniz için teşekkür ederim.

@aib’in cevabını çözüm olarak ekliyorum yardımcı olan / olmaya çalışan herkese teşekkürler.

1 Beğeni