pythonw.exe veya python.exe?


158

Uzun lafın kısası: pythonw.exehiçbir şey yapmaz, hiçbir şey python.exekabul etmez (hangisini kullanmalıyım?)

test.py:

print "a"

CMD penceresi:

C:\path>pythonw.exe test.py
<BLANK LINE>
C:\path>

C:\path>python.exe test.py
  File "C:\path\test.py", line 7
    print "a"
            ^
SyntaxError: invalid syntax

C:\path>

Lütfen bana ne yanlış yaptığımı söyle.


14
ne yazık ki bu python vs pythonw (genellikle daha ilginç yönü) iki yönünü karıştırır ve bazı temel sözdizimi python2'den python3'e değişir. önceden biliyorum ama yine de o kadar bu sorunun değerini taints olamazdı OP'nin hiçbir eleştiri piton hakkında go-kaynak w .
mnagel

Yanıtlar:


170

Programınızı çalıştırdığınızda bir terminal penceresinin açılmasını istemiyorsanız pythonw.exe;
Aksi takdirde,python.exe

Sözdizimi hatasıyla ilgili olarak: print artık 3.x'te bir işlevdir.
Bunun yerine şunu kullanın:

print("a")

284

Mevcut cevapları özetlemek ve tamamlamak için:

  • python.exeCLI tipi komut dosyalarını başlatmak için kullanılan bir konsol (terminal) uygulamasıdır .

    • Mevcut bir konsol penceresinden çalıştırılmadığı sürece python.exe yeni bir konsol penceresi açar .
    • Standart akarsu sys.stdin , sys.stdoutve sys.stderrolan konsol penceresine bağlı .
    • Bir veya PowerShell konsol penceresinden başlatıldığında yürütme senkronize olur cmd.exe: Aşağıdaki eryksun'un 1. yorumuna bakın.

      • Yeni bir konsol penceresi oluşturulduysa, komut dosyası sonlanıncaya kadar açık kalır.
      • Mevcut bir konsol penceresinden çağrıldığında, komut dosyası sona erene kadar bilgi istemi engellenir.
  • pythonw.exetüm GUI / no-UI komut dosyalarını başlatmak için bir GUI uygulaması .

    • NO konsol penceresi açılmamış.
    • Yürütme eşzamansız :
      • Bir konsol penceresinden çağrıldığında, komut dosyası yalnızca başlatılır ve komut dosyası hala çalışıyor olsun ya da olmasın, komut istemi hemen geri döner.
    • Standart akarsu sys.stdin , sys.stdoutve sys.stderrvardır KULLANILAMAZ .
      • Dikkat : Eğer ek adımlar sürece , bu vardır potansiyel olarak beklenmeyen yan etkiler :
        • İşlenmeyen istisnalar komut dosyasının sessizce iptal edilmesine neden olur .
        • Python 2.x'te, sadece kullanmaya çalışmak print()bunun olmasına neden olabilir (3.x'te, print()hiçbir etkisi yoktur).
        • Bunu senaryonuzdan önlemek ve daha fazla bilgi edinmek için bu cevabıma bakın .
        • Ad-hoc , çıkış yeniden yönlendirmesini kullanabilirsiniz : Teşekkürler, @handle.
          pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
          (PowerShell'den
          cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt:) dosyalarda stdout ve stderr çıktılarını yakalamak için .
          Kullanımı bu sen güvenen varsa print()sizin komut ile sessizce başarısız tek nedeni pythonw.exe: ve yorumlardan tutamacın komuta @ stdout'u çıkışı, kullanımda ilgi değiliz
          pythonw.exe yourScript.pyw 1>NUL 2>&1
          Caveat : Bu çıkış yönlendirme tekniği yapar değil çağrılırken işi *.pywkomut dosyalarını doğrudan ( komut dosyası dosyasının yolunu geçerek değil pythonw.exe). Aşağıdaki eryksun'un 2. yorumuna ve takiplerine bakınız.

Doğru dosya adı uzantısını seçerek, çalıştırılabilir dosyalardan hangisinin komut dosyanızı çalıştıracağını ( Explorer'dan açıldığında olduğu gibi) kontrol edebilirsiniz :

  • *.py dosyalar varsayılan olarak ile ilişkilendirilir (çağrılır) python.exe
  • *.pyw dosyalar varsayılan olarak ile ilişkilendirilir (çağrılır) pythonw.exe

1
Not: Stdout ve stderr'ı bir yere koyduğumda işe yarıyor: > pythonw ls.pyw >nul 2>&1(hiçbir şey yazılmamasına rağmen).
sap

1
Bu eşzamanlı ve eşzamansız davranış, komutu kullanmadan sadece cmd.exe etkileşimli komut isteminden kaynaklanır start. Aslında PEBbir konsol süreci olup olmadığını belirlemek için alt sürecini denetler . Konsol ana bilgisayar işlemi (conhost.exe) bunu umursamıyor. Eğer kullanırsanız subprocess.Popenbaşka takmak için python.exegeçerli konsola örneği ve yok waitüzerinde, o zaman aynı anda konsoluna erişmek için yarış hem süreçlerin bir kafa karmaşa olur.
Eryk Sun

2
Sistem çağrısı tarafından bir kullanıcı modu işlemi oluşturulur NtCreateUserProcess. Hedef yürütülebilir dosya bir konsol programı ise, sistem üst öğenin standart tanıtıcılarını koşulsuz olarak devralır. Ancak konsol dışı bir program için ebeveynin devralınan tutamaçlarını devralması açıkça belirtilmelidir. Bir dosyayı dosya ilişkilendirmesine dayalı olarak çalıştırmak için, cmd çağrılarıdır ShellExecuteEx; bu çağrı CreateProcess=> çağrıldığında tanıtıcıları açıkça devralmaz NtCreateUserProcess. Sonuç olarak, konsol G / Ç komut dosyalarını başlatırken standart G / Ç yeniden yönlendirme cmd olarak çalışır, ancak konsol dışı .pyw komut dosyaları çalıştırılmaz.
Eryk Sun

2
Cmd ilk çalışır kabuk CreateProcessile bInheritHandlesolarak geçirilir TRUE. Sadece geri düşüyor ShellExecuteExzaman CreateProcesshedef bir PE yürütülebilir (örneğin öyle bir .py script) değilse veya yükseltme gerektiriyor çünkü başarısız (örneğin osk.exe). Doğrudan çalıştırdığınızda Yani pythonw.exeya pyw.exebu cmd 's devralır StandardInput, StandardOutputve StandardErrorüzeri (aslında CRT) değiştirir cmd hangi SetStdHandleöncesinde ve çağrıldıktan sonra CreateProcessstandart G / Ç boru, dosyaya veya cihaza yönlendirilir zaman.
Eryk Sun

2
STARTUPINFOCmd'nin Python'lardan farklı olarak tanıtıcıları (hStdInput, hStdOutput, hStdErr) kullanmadığını unutmayın subprocess.Popen. Bu işten kurtulabilir çünkü tek iş parçacıklı bir programdır. ShellExecuteExGUI kabuk API'sinin başka türlü standart G / Ç desteği olmadığı için, yalnızca bu tasarım nedeniyle yeniden yönlendirme (yalnızca belirtildiği gibi konsol programları için) ile çalışır .
Eryk Sun


16

Başka bir işlemden (örneğin, komut satırından) bir python betiği çağıracaksanız, kullanın pythonw.exe. Aksi takdirde, kullanıcı sürekli cmdolarak python işlemini başlatan bir pencere görecektir . Komut dosyanızı hala aynı şekilde çalıştırır, ancak kullanıcı deneyimine girmez.

Örnek olarak e-posta gönderilebilir; python.exeCLI penceresi açılır, e-postayı gönderir, ardından pencereyi kapatır. Hızlı bir flaş olarak görünecek ve biraz sinir bozucu olarak kabul edilebilir. pythonw.exebunu önler, ancak yine de e-postayı gönderir.


6
Doğru, ama yeniden "diyelim ki, komut satırından": Zaten varsa vardır bir konsol (terminal) penceresinde, o zaman python.exeolacak değil başka birini açmak.
mklement0

2

Bunu bir süre işe almak için uğraşıyordum. Uzantıyı .pyw olarak değiştirdikten sonra, dosyanın özelliklerini açtığınızdan ve "birlikte aç" yolunu pythonw.exe'ye yönlendirdiğinizden emin olun.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.