Kod dosyalarımı .pyw
olarak kaydedersem, konsol penceresi görünmez - istediğim budur - ancak kod os.system
numaralı aramayı içeriyorsa, yine de sinir bozucu bir konsol penceresi alıyorum. Bunun os.system
numaralı çağrıya bağlı olduğunu farz ediyorum. .pyw
kodumdan konsol penceresini yükseltmeden diğer dosyaları yürütmenin bir yolu var mı?Os.system çağrısı içeren .pyw dosyasıyla konsol penceresi nasıl önlenir?
cevap
Sen bir konsol penceresi başlayan kaçınmak istiyorsanız argümanı shell=True
ile subprocess modülünü (subprocess.Popen
, subprocess.call
ya neyse) kullanarak deneyebilirsiniz.
subprocess.check_call iyi bir yerine geçer. – esm
Bu işe yaradı ... Teşekkürler! – twneale
'subprocess.check_call (args, shell = True)' ayarlandığından emin olun, burada 'args' genellikle bir konsola yazacağınız komut dizgesidir. Bir konsolun görünmesini istemediğimde neden kabuk = True' gerektiğinden emin değilim, fakat denememde bu gerçekleşti. – Kit
Sen dwFlags
nitelik subprocess.STARTF_USESHOWWINDOW
bayrak tutan ve wShowWindow
nitelik subprocess.SW_HIDE
bayrak tutan subprocess.STARTUPINFO
sınıfın startupinfo
parametrenin değer örneği olarak subprocess.Popen
sınıf geçmesini kullanmalıdır. Bu, subprocess.py
kaynak kodunun 866-868 okuma satırlarından çıkarılabilir. subprocess.CREATE_NEW_CONSOLE
bayrağını, bir konsol açmayan pythonw.exe
altında çalışırken creationflags
parametresinin değerini de girmek gerekebilir.
shell=True
'u kullandığınızda, yukarıdakilerin hepsinin doğru şekilde ayarlandığı ancak bunun uygun bir çözüm olmadığı anlamına gelmez. Tartışırdım çünkü komut yorumlayıcısını çalıştırmanın ve argümanları çözümlemenin ek yükünü ekler. Buna ek olarak, (...) kabuk = True = kullanımının, alt işlem modülünün belgelerine göre komut dizesinin harici girişinden oluşturulduğu durumlarda'dan vazgeçtiğini unutmayınız.
Bu giriş harici bir kaynaktan değildi ve özellikle de komut satırını ayrıştırmaktan daha fazla önem veremedim, özellikle de önlenmesi, yukarıda açıkladığınız karmaşık bir çözümü gerektirir. – twneale
'shell = True' kullanmak burada yapılacak doğru şey değildir ve doğru çözümün karmaşıklığı (bu) karmaşıklığı değiştirmez. –
Bunun en yüksek oylanan cevap olmadığına inanamıyorum. Her şey insanlar düzgün şeyler yapmak için 3 satır kod yazmaktan rahatsız olamaz. +1 – hammus
Piotr'in açıkladığı çözüm, aslında duyulabileceği kadar karmaşık değil. İşte startupinfo
konsol penceresi bastırmak için bir check_call
çağırma geçirilir bir örnektir:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.check_call(cmd, startupinfo=startupinfo)
kolaylık fonksiyonları
call
,
check_call
yana
ve ileri check_output
onların Popen
kurucusuna **kwargs
, kullanmak için gerekli değildir Popen
doğrudan.
-1: Mac'te hata veriyor. – ArtOfWarfare
@ArtOfWarfare Bu soru Windows'a özgüdür, bu nedenle diğer işletim sistemlerinde başarısız olması şaşırtıcı değildir. Yardım etmek isterseniz, Mac OS'de aldığınız hatayı tam olarak belirtmelisiniz. –
Bir sistem (Windows) diğerleriyle aynı şekilde davranabilmesi için etrafta ayrıntılı bir çalışma (aksi takdirde ne kadar kod gerektiğine göre) vardır, ancak süreçte diğerleri bozulur. 'Shell = true' ile gidiyorum - kısa, tatlı ve tüm platformlarda çalışıyor.Oh, ve Mac'teki sorun (ve * nix'i varsayalım) 'STARTUPINFO()' un tanınmaması üzerine bir istisna atar. – ArtOfWarfare
'os.popen' konsol penceresi üretmiyor gibi görünüyor. Komut dosyası 'pythonw' altında çalışıyor. Tüm vakalardan emin değilim ama benim durumumda iyi çalışıyor.
os.popen(command)
İnsanlar onların cevapları için @Piotr Dobrogost ve @Frank S. Thomas THX istiyoruz ... biraz tembeldir. Ayrıca)
; ... Daha sonra
import platform
import subprocess
startupinfo = None
if platform.system() == 'Windows':
import _subprocess # @bug with python 2.7 ?
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = _subprocess.SW_HIDE
args = [exe, ...]
out = subprocess.check_output(args, startupinfo=startupinfo)
Thx adamlar: sadece dikkat etmek
Linux ve Windows üzerinde runinng bu kod ile geldi 'call' kullanarak aşağıdaki kodu da Python 2'de çalışır.7 (Windows üzerinde) Yukarıdaki 'STARTUPINFO' koduyla: @firsthand, sana geçerli çalışan uygulamayı "yerine" wxPython kullanıcılı forumlarında okudum söylediklerini benzerdef run_command(cmd, sin, sout):
print "Running cmd : %s"%(" ".join(cmd))
return subprocess.call(cmd, stdin=sin, stdout=sout, startupinfo=startupinfo)
Bu benim için mükemmel çalıştı, teşekkürler. Neden herkes kabuk = True kullanmak isteyeceğini anlayamıyorum, bu sadece olmasını bekleyen bir hatadır. – Whatang
, o Eğer böyle bir şey kullandığınızda pyw.exe veya pythonw.exe ile "COMMAND.COM" veya "cmd.exe", olacağını şu:
os.execl(sys.executable, *([sys.executable]+sys.argv))
bkz sana nasıl bilmiyorum rağmen Bu durumda boru io olur.
Bu yaklaşımın bir avantajı, komut dosyasını CMD simgelerini doldurmama durumlarında işletim sistemi görev çubuğunuzun birkaç kez çalıştırılmasıdır. Diğer taraftan, görev çubuğunda simge durumuna küçültülmüş ve kapatmaya başlayan birkaç CMD'niz varsa, hangi CMD'nin hangi pythonw komut dosyasına gittiğini söylemek imkansızdır.
İlgili: [Konsolu olmayan Popen ile pythonw'da bir işlem çalıştırmak] (http://stackoverflow.com/q/1813872/95735) –
os.system() uygulamasının YENİ bir cmd işlemi başlattığına inanıyorum. Yeni cmd işlemini pythonw.exe işleminizle değiştirmek için os.execl() öğesini deneyin. Bu durumda os.system için – DevPlayer