2013-04-25 7 views
6

os.systemを使用してさまざまなコマンドを実行するPythonプログラムがあります。 (subprocessを使用することはできません。なぜなら、Python 2.0まで下位互換性がなければならないからです。「X.dllが見つからないためプログラムを起動できません」エラーポップアップ

Windowsでは、時々コマンドが異常なディレクトリのDLLを参照することがあるため、 「X.dllが見つかりません」というエラーポップアップが表示されます。

Windows error popup with title "cl.exe - System Error" and text "The program can't start because mspdb80.dll is missing from your computer. Try reinstalling the program to fix this problem."

私の質問は、コマンドは、すべてのDLLを見つけるようにする方法についてではありません。私はすでにそれを行う方法を知っています。私が知りたいことは、Windowsにが表示されないようにするにはどうすればいいですか? DLLが見つからないときは?代わりに、子プロセスはstderr(os.system呼び出し内のファイルにリダイレクトされている)にエラーメッセージを出力し、エラーコードを返すようにします(os.systemにエラーコードが返されます)。そうすれば、誰かがOKをクリックするまで来るまで、私のプログラムはエラーを捕捉して独自の方法で報告することができます。

MSDNは、通常、私の友人ですが、今回は、欠落している特定のDLLに対処する方法についてアドバイスを得ています。

これを繰り返しても、これは後方互換性が非常に悪い状況です。私は、Python 2.7またはそれ以前のバージョンの2.0からすべての方法で動作するソリューションが必要です。それはまた、Windows(XP、Vista、7、8)のすべての普及しているバージョンで動作する必要があります。 で作業してもより古い Windowsは非常に望ましいですが、100%必要ではありません。さらに、他の言語で書かれたサードパーティのモジュールやヘルパープログラムはオプションではありません。 (.BATファイルが問題ありません。

+0

少しわかりますか? Pythonを使わずにこのマシンでcl.exeを実行すると、同じエラーがポップアップしますか? – Krets

+0

私が選んだいくつかの 'PATH'設定のどれかによっては、そうでないかもしれません。 *しかし、それは問題のポイントではありません。*私はすでに 'PATH'を調整する方法を知っています。問題は、このアウトオブバンドのダイアログボックスではなく、*エラー*を私のプログラムに報告する方法です。 – zwol

答えて

7

SetErrorModeの呼び出しプロセスでダイアログボックスを無効にすることができます。ただし、SEM_FAILCRITICALERRORSでカバーされている「重大なエラー」の1つとして「ロード時にDLLが見つからない」ことが検出された場合は、LoadLibraryのマニュアルを参照する必要があります。

CREATE_DEFAULT_ERROR_MODEで作成されていない限り、エラーモードは子プロセスを継承し、CMD.EXEはサブプロセスを作成するときにそのフラグを設定しないように見えます。サブプロセスは、(特定のエラーコードで終了:だから

if sys.platform == 'win32': 
    try: 
     import ctypes 
     # SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX|SEM_NOOPENFILEERRORBOX 
     ctypes.windll.kernel32.SetErrorMode(0x0001|0x0002|0x8000) 
    except: 
     pass 

これが最適なソリューションではありません...実際に私が気に状況でダイアログボックスを抑制しない私のPythonスクリプトでの起動時にエラーモードを設定します0xC0000135 - "missing DLL"として実際には文書化されていませんが、明らかにその番号で検索すると何が表示されるかではわかりますが)DLLのような詳細は床に落とされます。私はまだローダが詳細を​​stderrに報告する設定をどこかに見つけることを望んでいます。

関連する問題