pythonw.exeまたはpython.exe?


157

短い話:pythonw.exe何もせず、何もpython.exe受け入れません(どちらを使用すればよいですか?)

test.py:

print "a"

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>

私がひどく間違っていることを教えてください。


14
残念ながら、これは2つのアスペクトpythonとpythonw(一般的にはより興味深いアスペクト)を混ぜ合わせ、いくつかの基本的な構文がpython2からpython3に変更されています。事前に知っているが、それにもかかわらず、それは、この質問の値は汚染さことができませんでしたOPのない批判しないのpythonに取り掛かる-にリソースワットを
mnagel 2017

回答:


170

プログラムの実行時に端末ウィンドウをポップアップさせたくない場合は、を使用してくださいpythonw.exe
それ以外の場合は、python.exe

構文エラーに関して:print 3.xの関数になりました
ので、代わりに使用してください:

print("a")

283

既存の回答を要約して補足するには:

  • python.exeCLIタイプのスクリプトを起動するためのコンソール(ターミナル)アプリケーションです

    • 既存のコンソールウィンドウから実行しない限りpython.exe 、新しいコンソールウィンドウを開きます
    • 標準ストリーム sys.stdinsys.stdoutおよびsys.stderrれているコンソールウィンドウに接続されました
    • 実行がある、同期から起動するときcmd.exeやPowerShellのコンソールウィンドウ:参照eryksun以下の第一コメント。

      • 新しいコンソールウィンドウが作成された場合、スクリプトが終了するまで開いたままになります。
      • 既存のコンソールウィンドウから呼び出されると、スクリプトが終了するまでプロンプトはブロックされます。
  • pythonw.exeGUI / no-UI-at-allスクリプトを起動するためのGUIアプリです。

    • コンソールウィンドウは開きません。
    • 実行は非同期です:
      • コンソールウィンドウから起動した場合、スクリプトは単にされて立ち上げたスクリプトがまだ実行されているかどうか、すぐにとプロンプトに戻ります。
    • 標準ストリーム sys.stdinsys.stdoutおよびsys.stderrされている利用可能NOT
      • 注意追加の手順を実行しない限り、これには予期しない副作用生じる可能性があります
        • 未処理の例外は、スクリプトがする原因中止静か
        • Python 2.xでは、使用しようとするだけでprint()それが発生する可能性があります(3.xではprint()効果がありません)。
        • スクリプト内からそれを防ぎ、詳細については、私の答えをご覧ください。
        • アドホック出力のリダイレクトを使用できます:ありがとう、@ handle。
          pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
          (PowerShell:から
          cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt)stdoutおよびstderr出力をファイルにキャプチャします。スクリプトがサイレントで失敗する唯一の理由がの
          使用であるprint()と確信していてpythonw.exe、stdout出力に関心がない場合は、コメントから
          pythonw.exe yourScript.pyw 1>NUL 2>&1
          @handleのコマンドを使用してください。警告:この出力リダイレクト手法は、スクリプトを直接呼び出す場合は機能しませ(スクリプトファイルのパスを)に渡すのとは対照的に)。参照してくださいeryksun以下の第二のコメントとそのフォローアップを。*.pywpythonw.exe

正しいファイル名拡張子を選択することにより、エクスプローラーから開いたときなど、どの実行可能ファイルがデフォルトでスクリプトを実行するかを制御できます

  • *.py デフォルトでは、ファイルは関連付けられている(呼び出されている) python.exe
  • *.pyw デフォルトでは、ファイルは関連付けられている(呼び出されている) pythonw.exe

1
PS:stdoutとstderrをどこかにパイプすると> pythonw ls.pyw >nul 2>&1、何も書かれていなくても機能します。
ハンドル

1
この同期および非同期の動作は、startコマンドを使用せずにcmd.exe対話型コマンドプロンプトからのものです。PEB子プロセスのを実際に検査して、コンソールプロセスかどうかを判断します。コンソールホストプロセス(conhost.exe)はこれを気にしません。を使用subprocess.Popenpython.exeて現在のコンソールに別のインスタンスをアタッチwaitし、それをオンにしない場合、両方のプロセスが競合してコンソールに同時にアクセスするという混乱する混乱が生じます。
Eryk Sun 2016

2
ユーザーモードプロセスは、システムコールによって作成されますNtCreateUserProcess。ターゲットの実行可能ファイルがコンソールプログラムの場合、システムは無条件に親の標準ハンドルを継承します。しかし、非コンソールプログラムの場合は、親の継承可能なハンドルを継承するように明示的に指示する必要があります。ファイルの関連付けに基づいてファイルを実行するには、cmdを呼び出しますShellExecuteEx。これは、CreateProcess=>を呼び出したときにハンドルを明示的に継承しませんNtCreateUserProcess。その結果、コンソールの.pyスクリプトを開始すると、標準I / Oのリダイレクトがcmdで機能しますが、非コンソールの.pywスクリプトは機能しません。
Eryk Sun 2016

2
cmdシェルは最初にCreateProcessbInheritHandles渡されTRUEたを使用して試行します。ターゲットがPE実行可能ファイルではない(例:.pyスクリプト)か、昇格が必要なため(例:osk.exe)ShellExecuteExCreateProcess失敗した場合にのみフォールバックします。あなたが直接実行したときにそうpythonw.exepyw.exe、それはCMDのを継承するStandardInputStandardOutputStandardError経由して(実際にCRT)修正をcmdをこれ、SetStdHandle前と呼び出した後CreateProcess、標準的なI / Oをパイプ、ファイル、またはデバイスにリダイレクトされたとき。
Eryk Sun、2016

2
STARTUPINFOPythonのとは異なり、cmdはハンドル(hStdInput、hStdOutput、hStdErr)を使用しないことに注意してくださいsubprocess.Popen。これはシングルスレッドプログラムであるため、この問題を回避できます。ShellExecuteExGUIシェルAPIが標準のI / Oをサポートしていないため、リダイレクションが(コンソールプログラムに対してのみ)機能するのは、この設計のためだけです。
Eryk Sun、2016


16

他のプロセスから(たとえば、コマンドラインから)pythonスクリプトを呼び出す場合は、を使用しますpythonw.exe。そうしないとcmd、Pythonプロセスを起動するウィンドウが継続的に表示されます。それでもスクリプトは同じように実行されますが、ユーザーエクスペリエンスには影響しません。

例としては、電子メールの送信があります。python.exeCLIウィンドウをポップアップし、電子メールを送信して、ウィンドウを閉じます。それはすぐにフラッシュとして表示され、やや迷惑と見なすことができます。pythonw.exeこれを避けますが、それでも電子メールを送信します。


6
確かに、しかし、「コマンドラインから、言う」再:あなたは既に場合ですコンソール(ターミナル)ウィンドウで、その後python.exeになるではない別のものを開きます。
mklement0

2

これをしばらく機能させるのに苦労していました。拡張子を.pywに変更したら、必ずファイルのプロパティを開き、「開く」パスをpythonw.exeに指定してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.