import logging, logging.handlers
def main():
ntl = logging.handlers.NTEventLogHandler("Python Logging Test")
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
logger.addHandler(ntl)
logger.error("This is a '%s' message", "Error")
if __name__ == "__main__":
main()
上記の Python (2.7.x) スクリプトは、「これは 'エラー' メッセージです」と Windows イベント ビューアに書き込みます。スクリプトとして実行すると、期待どおりの出力が得られます。PyInstaller を使用してスクリプトを実行可能ファイルに変換すると、イベント ログにエントリが記録されますが、まったく異なる内容が表示されます。
ソース ( Python Logging Test ) のイベント ID ( 1 ) の説明が見つかりません。ローカル コンピュータに、リモート コンピュータからのメッセージを表示するために必要なレジストリ情報またはメッセージ DLL ファイルがない可能性があります。/AUXSOURCE= フラグを使用して、この説明を取得できる場合があります。詳細については、ヘルプとサポートを参照してください。次の情報はイベントの一部です: これは「エラー」メッセージです。
これは、スクリプトを実行可能ファイルに変換するために使用するコマンドです。pyinstaller.py --onefile --noconsole my_script.py
ただし、コマンド ライン パラメータはこの動作に影響を与えないようで、pyinstaller.py my_script.py
.
何が起こっているのか、そしてこれをどのように修正するのかを理解するのに助けていただければ幸いです。
最終的解決
リソース ハッカー ルートをたどりたくありませんでした。これは、自動化するのが難しいステップになるからです。代わりに、私がとったアプローチはwin32service.pyd
、c:\Python27\Lib\site-packages\win32 からファイルを取得し、実行可能ファイルの隣に配置することでした。次に、スクリプトが変更され、ファイルのコピーへのフル パスが渡されましたwin32service.pyd
。これは、スクリプトと exe 形式の両方で機能します。最終的なスクリプトを以下に示します。
import logging, logging.handlers
import os
import sys
def main():
base_dir = os.path.dirname(sys.argv[0])
dllname = os.path.join(base_dir, "win32service.pyd")
ntl = logging.handlers.NTEventLogHandler("Python Logging Test", dllname=dllname)
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
logger.addHandler(ntl)
logger.error("This is a '%s' message", "Error")
if __name__ == "__main__":
main()