pythonw.exe atau python.exe?


157

Singkat cerita: pythonw.exetidak melakukan apa-apa, python.exetidak menerima apa-apa (mana yang harus saya gunakan?)

test.py:

print "a"

Jendela CMD:

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>

Tolong beritahu saya apa yang saya lakukan salah besar.


14
sayangnya ini mencampurkan dua aspek python vs pythonw (umumnya aspek yang lebih menarik) dan beberapa sintaks dasar berubah dari python2 ke python3. ada kritik dari OP yang tidak bisa tahu sebelumnya, tapi tetap saja itu menodai nilai pertanyaan ini sebagai yang pergi-untuk sumber daya tentang python w .
mnagel

Jawaban:


170

Jika Anda tidak ingin jendela terminal muncul ketika Anda menjalankan program Anda, gunakan pythonw.exe;
Kalau tidak, gunakanpython.exe

Mengenai kesalahan sintaksis: print sekarang fungsi dalam 3.x
Jadi gunakan sebagai gantinya:

print("a")

283

Untuk merangkum dan melengkapi jawaban yang ada:

  • python.exeadalah aplikasi konsol (terminal) untuk meluncurkan skrip tipe CLI .

    • Kecuali dijalankan dari jendela konsol yang ada, python.exe buka jendela konsol baru .
    • Standar sungai sys.stdin , sys.stdoutdan sys.stderryang terhubung ke jendela konsol .
    • Eksekusi sinkron ketika diluncurkan dari cmd.exejendela konsol PowerShell: Lihat komentar pertama eryksun di bawah ini.

      • Jika jendela konsol baru dibuat, jendela itu tetap terbuka sampai skrip berakhir.
      • Ketika dipanggil dari jendela konsol yang ada, prompt diblokir sampai skrip berakhir.
  • pythonw.exeadalah aplikasi GUI untuk meluncurkan skrip GUI / no-UI-at-all .

    • TIDAK ada jendela konsol yang dibuka.
    • Eksekusi tidak sinkron :
      • Ketika dipanggil dari jendela konsol, skrip hanya diluncurkan dan prompt segera kembali, apakah skrip masih berjalan atau tidak.
    • Standar sungai sys.stdin , sys.stdoutdan sys.stderryang TIDAK tersedia .
      • Perhatian : Kecuali jika Anda mengambil langkah-langkah tambahan , ini berpotensi menimbulkan efek samping :
        • Pengecualian yang tidak tertangani menyebabkan skrip dibatalkan secara diam-diam .
        • Dalam Python 2.x, hanya mencoba menggunakan print()dapat menyebabkan hal itu terjadi (dalam 3.x, print()tidak memiliki efek).
        • Untuk mencegah hal itu dari dalam skrip Anda , dan untuk mempelajari lebih lanjut, lihat jawaban saya ini.
        • Ad-hoc , Anda dapat menggunakan pengalihan output : Terima kasih, @handle.
          pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
          (dari PowerShell:)
          cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txtuntuk mengambil stdout dan stderr output dalam file .
          Jika Anda yakin bahwa penggunaan print()adalah satu-satunya alasan skrip Anda gagal secara diam-diam pythonw.exe, dan Anda tidak tertarik dengan stdout output, gunakan perintah @ handle dari komentar:
          pythonw.exe yourScript.pyw 1>NUL 2>&1
          Peringatan : Teknik pengalihan output ini tidak berfungsi saat menjalankan *.pywskrip secara langsung ( sebagai lawan dengan melewati jalur file skrip ke pythonw.exe). Lihat komentar kedua eryksun dan tindak lanjutnya di bawah ini.

Anda dapat mengontrol mana dari executable yang menjalankan skrip Anda secara default - seperti ketika dibuka dari Explorer - dengan memilih ekstensi nama file yang tepat :

  • *.py file secara default dikaitkan (dipanggil) dengan python.exe
  • *.pyw file secara default dikaitkan (dipanggil) dengan pythonw.exe

1
PS: Itu bekerja ketika saya memasang stdout dan stderr di suatu tempat: > pythonw ls.pyw >nul 2>&1(walaupun tidak ada yang tertulis).
handle

1
Perilaku sinkron dan asinkron ini hanya dari prompt perintah interaktif cmd.exe tanpa menggunakan startperintah. Ini sebenarnya memeriksa PEBproses anak untuk menentukan apakah itu proses konsol. Proses host konsol (conhost.exe) tidak peduli tentang ini. Jika Anda menggunakan subprocess.Popenuntuk melampirkan python.exeinstance lain ke konsol saat ini dan tidak waitdi atasnya, maka Anda akan memiliki kekacauan membingungkan dari kedua proses balap untuk mengakses konsol secara bersamaan.
Eryk Sun

2
Proses mode pengguna dibuat oleh panggilan sistem NtCreateUserProcess. Jika target executable adalah program konsol, sistem tanpa syarat mewarisi pegangan standar orangtua. Tetapi untuk program non-konsol itu perlu secara eksplisit diberitahu untuk mewarisi pegangan bawaan orang tua. Untuk menjalankan file berdasarkan pada asosiasi file, cmd panggilan ShellExecuteEx, yang tidak secara eksplisit mewarisi pegangan ketika memanggil CreateProcess=> NtCreateUserProcess. Akibatnya mengarahkan ulang I / O standar bekerja dalam cmd ketika memulai skrip .py script tetapi bukan skrip .pyw non-konsol.
Eryk Sun

2
Cmd shell pertama kali mencoba CreateProcessdengan bInheritHandleslulus sebagai TRUE. Ini hanya jatuh kembali ShellExecuteExketika CreateProcessgagal karena targetnya bukan PE yang dapat dieksekusi (mis. Ini adalah skrip .py) atau memerlukan peninggian (misalnya osk.exe). Jadi, ketika Anda langsung menjalankan pythonw.exeatau pyw.exe, itu akan mewarisi ini cmd StandardInput, StandardOutput, dan StandardError, yang cmd (sebenarnya CRT) memodifikasi via SetStdHandlesebelum dan setelah memanggil CreateProcessketika standar I / O dialihkan ke pipa, file, atau perangkat.
Eryk Sun

2
Perhatikan bahwa cmd tidak menggunakan STARTUPINFOpegangan (hStdInput, hStdOutput, hStdErr), tidak seperti Python subprocess.Popen. Ini bisa lolos dengan ini karena ini adalah program single-threaded. Hanya karena desain ini pengalihan berfungsi sama sekali ShellExecuteEx(hanya untuk program konsol, seperti yang disebutkan) karena API shell GUI sebaliknya tidak memiliki dukungan untuk I / O standar.
Eryk Sun


16

Jika Anda akan memanggil skrip python dari beberapa proses lain (katakanlah, dari baris perintah), gunakan pythonw.exe. Jika tidak, pengguna Anda akan terus melihat cmdjendela meluncurkan proses python. Itu masih akan menjalankan skrip Anda sama saja, tetapi tidak akan mengganggu pengalaman pengguna.

Contoh mungkin mengirim email; python.exeakan memunculkan jendela CLI, mengirim email, lalu menutup jendela. Ini akan muncul sebagai flash cepat, dan dapat dianggap agak menjengkelkan. pythonw.exehindari ini, tetapi tetap mengirim email.


6
Benar, tetapi ulang "katakanlah, dari baris perintah": Jika Anda sudah berada di jendela konsol (terminal), maka tidakpython.exe akan membuka yang lain.
mklement0

2

Saya sedang berjuang untuk mendapatkan ini berfungsi untuk sementara waktu. Setelah Anda mengubah ekstensi ke .pyw, pastikan Anda membuka properti file dan mengarahkan jalur "buka dengan" ke pythonw.exe.


-4

Dalam pengalaman saya pythonw.exe lebih cepat setidaknya dengan menggunakan pygame.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.