2010-11-20 48 views
16

サービスとしてWindows 2003サーバーでpython2.5スクリプトを実行しています。彼らは唯一の開発目的のために使用されたので、なぜIOError:(9、 'Bad file descriptor')エラーが発生しているのですか?

IOError: (9, 'Bad file descriptor') 

は、私はすべてのprint文を削除したが、私はprint文は私にすべてのグライフを引き起こす理由がわからない午前:私は、簡易印刷たstatmentsために、このエラーを取得しています。重大な問題がなくても同じスクリプトをサービスとして実行しませんでした。他の誰かが洞察力を持っているかどうかは疑問です

答えて

24

sys.stdoutはコンソールセッションとして実行していないときには使用できないため、印刷できません。

loggingモジュールを使用するといいでしょう。loggingモジュールを使用すると、ログレベルを設定して、システムイベントログに重要な事項をすべて書き込むことができます。


このような何かをすることによってあなたはまだそれが仕事(または黙っ問題を無視)して得ることができることに留意すべきである:

出力ストリームごとのファイルに書き込むには:

import sys 
sys.stdout = open('stdout.txt', 'w') 
sys.stderr = open('stderr.txt', 'w') 

import sys 
sys.stdout = sys.stderr = open('output.txt', 'w') 

それとも黙ってすべてのprint文を無視する:単一のファイルへの書き込みを

import sys 
class NullWriter(object): 
    def write(self, value): pass 

sys.stdout = sys.stderr = NullWriter() 
+7

、最初にプログラムがコンソールで実行されない場合、3つのファイル記述子(stdin、stdout、およびstderrに対応)は使用できません。 –

+0

+1 Ignacio Vazquez-Abrams、非常に便利です。 – Wolph

+1

すべての印刷文を暗黙に無視する別の方法 'sys.stdout = open(os.devnull、 'w') ' –

3

Python 2.xでは、これが予想される動作です。 this bug reportでは、キリスト教のHeimesは、設計上の決定であることを説明しています

I recommend against changing the code so late in the Python 2.7 release cycle. A change in behavior is too confusing. And it's not a bug but a design decision, too. Over five years ago I implement parts of the IO interaction with the operating system for Python 3.0. I deliberately did NOT port modifications to 2.6.

彼はまた、Pythonの2.7でのPython 3.xのスタイルprint()行動を取得するための回避策をお勧めします。

具体的
from __future__ import print_function 
import sys 
if sys.executable.endswith("pythonw.exe"): 
    sys.stdout = sys.stdout = None 

print("can handle sys.stdout = None just fine.") 
+0

デリック、この回答にはかなりの争点があります(http://meta.stackoverflow.com/q/318893/)。このサイトの情報の質を可能な限り高く保つために頑張っている経験豊富なユーザーは、オフサイト情報へのリンクのみを含んでいるとフラグを付けました。私たちは、リンクがダウンする可能性があるので、そのようなタイプの答えを妨げる傾向があります。これは、答えが役に立たないようにします。これはなぜそれがdownvotedされていると、それに対して複数の票を持ってそれを削除するために持っている理由です。しかし、私はあなたが提供したリンクの価値を見ています、そして、この答えを削除することが適切な解決策であるとは思わないでください。 –

+0

代わりに、私と他のユーザーがあなたの答えにリンクからの関連情報を編集しました。これは、回答の保留中の削除を避けるために役立ち、おそらくいくつかのアップフォースを得るでしょう。あなたが新しいユーザーであると、あなたはサイトに関する悪い経験をしていることを申し訳ありません。将来的に回答を投稿するときは、良い答えは完全に自己完結していることに留意してください。私がここでやったことが一番いいのは、補足としてのリンクだけを含めて、関連する情報を答えに編集することです。とにかく、面白いビジネスを説明したかっただけです。あなたに最高の運があります! –

+0

更新いただきありがとうございます。私がそれをバグだと考えているかどうかはまだ分かりません。 printステートメントは事実上のデバッグツールなので、私の意見ではそれほどシンプルではないでしょう。編集にはコード行があります: "sys.stdout = sys.stdout = None";これは代わりに "sys.stdout = sys.stderr = None"でなければなりませんか? – Derrick

関連する問題