26

単純な .py または .pyw python ファイルを実行すると、python.exeタスク マネージャーの下に表示されます。

python myApp.py
python myApp.pyw

ただし、コンソールを使用せずにスクリプトを実行しようとすると、スクリプトが実行されていないように見えたり、タスク マネージャーの下に表示されpython.exeたりしないpythonw.exe

pythonw myApp.pyw
pythonw myApp.py

問題のトラブルシューティング方法を教えてください。システムは Python 2.7.8 x64 を実行しています。

4

7 に答える 7

36

tl;dr

  • トラブルシューティングするには、呼び出し時に出力リダイレクトを使用します。

    pythonw myApp.py 1>stdout.txt 2>stderr.txt
    

print()これにより、 from 、 in file stdout.txt、stderr 出力 (未処理の例外など)などの stdout 出力が file にキャプチャされますstderr.txt。PowerShell から、を使用します
cmd /c pythonw myApp.py 1>stdout.txt 2>stderr.txt)。stdoutをリダイレクトする行為そのものが実際スクリプトを再び機能させる可能性があることに
注意してください. 警告: この出力リダイレクト手法は、スクリプトを直接呼び出す場合(スクリプト ファイル パスを に渡す場合とは対照的に) 機能しないようです。理由がわかっている場合、および/またはそれがうまくいく場合はお知らせください。pythonwprint
*.pywpythonw.exe

  • スクリプトを修正するには:

実行するpythonw.exe任意の Python 2.x または 3.x スクリプトの先頭に次を配置します。

import sys, os
if sys.executable.endswith("pythonw.exe"):
  sys.stdout = open(os.devnull, "w");
  sys.stderr = open(os.path.join(os.getenv("TEMP"), "stderr-"+os.path.basename(sys.argv[0])), "w")

これにより、スクリプトを で実行すると、次のことが保証されますpythonw.exe

  • print()への呼び出しと明示的な呼び出しsys.stdout()は事実上無視されます (no-ops)。
  • 未処理の致命的な例外を含む標準エラー出力は、ファイルに送信されます %TEMP%\stderr-<scriptFileName>%TEMP%一時ファイル用の現在のユーザーのフォルダーを指す標準の Windows 環境変数です。

つまり、上記のコードを使用して、スクリプトが で呼び出されたときにサイレントに失敗した後、ファイルをチェック%TEMP%\stderr-<scriptFileName>pythonw.exeします。

説明については、読み進めてください。


Windows では、pythonw.exeGUI/no-UI-at-all スクリプトを起動するためのものです。これは、標準の入力および出力ストリーム - sys.stdinsys.stdoutsys.stderrが利用できないことを意味します。

これには2 つの厄介な副作用があります。

  • print()- which targets sys.stdoutby default -を使用すると、Python 2.x で例外が発生します。
    • この問題は Python 3.x で修正されました。
  • 未処理の例外print()(2.x でトリガーされた例外を含む) は、スクリプトをサイレントに中止させます。
    • 例外エラー メッセージはsys.stderrデフォルトで送信されますが、これはこのシナリオでは利用できないものです。

上記のコードは、次の方法でこれらの問題を修正します。

  • stdout 出力をヌルデバイスに送信し、出力しようとする試みを事実上無視しますsys.stdout- 明示的または暗黙的にprint().

  • すべての stderr 出力を一時ファイルに送信します。


Python 2.x と Python 3.x の違い:

、、、およびを使用してスクリプトを実行するとpythonw.exe、 次sys.stdinのようsys.stdoutになりsys.stderrます。

  • Python 2.xの場合:無効なファイル記述子があります
    • orに書き込もうとしたときの最終的な結果は、次の例外です。sys.stdoutsys.stderrIOError: [Errno 9] Bad file descriptor
    • 落とし穴:出力バッファリングのため、この例外は、たとえば 4K バイトを出力するまで表面化しない場合があります。(バッファリングされていない出力の場合)でpythonw.exe呼び出すことにより、即座にそれを誘発できます。-u
    • print()盲目的にsys.stdout(デフォルトで) 試行するため、遅かれ早かれこの例外が発生します。
  • Python 3.xの場合: に設定されていますNone
    • これは、 が検出されたときにno-op (何もしない) を実行する3.xprint()関数で補完されるため、ステートメントをデフォルトで安全に使用できます。sys.stdoutNoneprint()pythonw.exe
    • ただし、使用しようとするsys.stdout.write()sys.stderr.write()例外が発生します。

背景の詳細​​については、こちらを参照してください。

于 2015-05-18T18:14:38.857 に答える
5

import sys; sys.stderr = open("errlog.txt", "w")の先頭に行を追加してみてくださいmyApp.py。次にerrlog.txt、トレースバックまたはその他のエラー メッセージを調べます。

于 2014-07-19T02:37:03.007 に答える
-1

私はあなたの問題を理解しているかどうかわかりませんが、これはあなたが知る必要があることだと思います

py または pyw ファイルを右クリックし、次で開くを選択する必要があります... find python.exe (おそらく C:\Python27\python.exe) .. 常に開いているというボックスをチェックします ... これで、2 倍にすることができます実行したい場合はクリックしてください

(通常、インストーラーがこれを設定します...)

于 2014-07-18T23:34:42.397 に答える