2009-11-19 13 views
11

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?

+0

İlgili: [Konsolu olmayan Popen ile pythonw'da bir işlem çalıştırmak] (http://stackoverflow.com/q/1813872/95735) –

+0

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

cevap

5

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.

+1

subprocess.check_call iyi bir yerine geçer. – esm

+0

Bu işe yaradı ... Teşekkürler! – twneale

+1

'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

13

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.

+0

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

+1

'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. –

+2

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

13

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.

+0

-1: Mac'te hata veriyor. – ArtOfWarfare

+2

@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. –

+0

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

1

'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) 
7

İ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 benzer
def run_command(cmd, sin, sout): 
    print "Running cmd : %s"%(" ".join(cmd)) 
    return subprocess.call(cmd, stdin=sin, stdout=sout, startupinfo=startupinfo) 
+0

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

0

, 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)) 

another post

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 konular