Singkat cerita: pythonw.exe
tidak melakukan apa-apa, python.exe
tidak 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.
python
python-3.x
tidak berhasil
sumber
sumber
Jawaban:
Jika Anda tidak ingin jendela terminal muncul ketika Anda menjalankan program Anda, gunakan
pythonw.exe
;Kalau tidak, gunakan
python.exe
Mengenai kesalahan sintaksis:
print
sekarang fungsi dalam 3.xJadi gunakan sebagai gantinya:
sumber
Untuk merangkum dan melengkapi jawaban yang ada:
python.exe
adalah aplikasi konsol (terminal) untuk meluncurkan skrip tipe CLI .python.exe
buka jendela konsol baru .sys.stdin
,sys.stdout
dansys.stderr
yang terhubung ke jendela konsol .Eksekusi sinkron ketika diluncurkan dari
cmd.exe
jendela konsol PowerShell: Lihat komentar pertama eryksun di bawah ini.pythonw.exe
adalah aplikasi GUI untuk meluncurkan skrip GUI / no-UI-at-all .sys.stdin
,sys.stdout
dansys.stderr
yang TIDAK tersedia .print()
dapat menyebabkan hal itu terjadi (dalam 3.x,print()
tidak memiliki efek).pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
(dari PowerShell:)
cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
untuk mengambil stdout dan stderr output dalam file .Jika Anda yakin bahwa penggunaan
print()
adalah satu-satunya alasan skrip Anda gagal secara diam-diampythonw.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
*.pyw
skrip secara langsung ( sebagai lawan dengan melewati jalur file skrip kepythonw.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) denganpython.exe
*.pyw
file secara default dikaitkan (dipanggil) denganpythonw.exe
sumber
> pythonw ls.pyw >nul 2>&1
(walaupun tidak ada yang tertulis).start
perintah. Ini sebenarnya memeriksaPEB
proses anak untuk menentukan apakah itu proses konsol. Proses host konsol (conhost.exe) tidak peduli tentang ini. Jika Anda menggunakansubprocess.Popen
untuk melampirkanpython.exe
instance lain ke konsol saat ini dan tidakwait
di atasnya, maka Anda akan memiliki kekacauan membingungkan dari kedua proses balap untuk mengakses konsol secara bersamaan.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 panggilanShellExecuteEx
, yang tidak secara eksplisit mewarisi pegangan ketika memanggilCreateProcess
=>NtCreateUserProcess
. Akibatnya mengarahkan ulang I / O standar bekerja dalam cmd ketika memulai skrip .py script tetapi bukan skrip .pyw non-konsol.CreateProcess
denganbInheritHandles
lulus sebagaiTRUE
. Ini hanya jatuh kembaliShellExecuteEx
ketikaCreateProcess
gagal karena targetnya bukan PE yang dapat dieksekusi (mis. Ini adalah skrip .py) atau memerlukan peninggian (misalnya osk.exe). Jadi, ketika Anda langsung menjalankanpythonw.exe
ataupyw.exe
, itu akan mewarisi ini cmdStandardInput
,StandardOutput
, danStandardError
, yang cmd (sebenarnya CRT) memodifikasi viaSetStdHandle
sebelum dan setelah memanggilCreateProcess
ketika standar I / O dialihkan ke pipa, file, atau perangkat.STARTUPINFO
pegangan (hStdInput, hStdOutput, hStdErr), tidak seperti Pythonsubprocess.Popen
. Ini bisa lolos dengan ini karena ini adalah program single-threaded. Hanya karena desain ini pengalihan berfungsi sama sekaliShellExecuteEx
(hanya untuk program konsol, seperti yang disebutkan) karena API shell GUI sebaliknya tidak memiliki dukungan untuk I / O standar.Lihat di sini: http://docs.python.org/using/windows.html
pythonw.exe "Ini menekan jendela terminal saat startup."
sumber
pythonw.exe
memiliki efek samping yang mungkin gagal pada program Anda secara diam-diam jika ia menulis ke stdout / stderr stream - lihat bugs.python.org/issue706263Jika Anda akan memanggil skrip python dari beberapa proses lain (katakanlah, dari baris perintah), gunakan
pythonw.exe
. Jika tidak, pengguna Anda akan terus melihatcmd
jendela meluncurkan proses python. Itu masih akan menjalankan skrip Anda sama saja, tetapi tidak akan mengganggu pengalaman pengguna.Contoh mungkin mengirim email;
python.exe
akan memunculkan jendela CLI, mengirim email, lalu menutup jendela. Ini akan muncul sebagai flash cepat, dan dapat dianggap agak menjengkelkan.pythonw.exe
hindari ini, tetapi tetap mengirim email.sumber
python.exe
akan membuka yang lain.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.
sumber
Dalam pengalaman saya pythonw.exe lebih cepat setidaknya dengan menggunakan pygame.
sumber