2022年6月9日木曜日

python print()をリダイレクト

 pythonコードのデバッグのためには、print()でオブジェクトを表示できたほうがよいので、coutをリダイレクトする処理を追加しました。これによりpythonと同じprint出力となります。sc3.print()は、文字列しか処理できないので今後obsoleteになります。

sc3.hook_stdout()がそのための文です。以下、python print()文による出力となります。

post_main()は、解が出た後に呼ばれます。解もpythonソースとしてアタッチしているので、解を整形して、Excelに出力させることが出来ます。ユーザ独自のExcelシートに直接書き込みます。

pythonソースは、Excelシートを読み込んで、名前を検索してprintするだけのサンプルです。Excelシートは、お医者さま用プロジェクトを独自に作成しました。

コンソールには、Findして得たreturnオブジェクトをprint()した出力が出ています。

Excelに渡すファイルパス名は、フルパスである必要は分かりますが、なぜか/ではダメで逆スラッシュにしないと動作しませんでした。



def post_main():
    sc3.hook_stdout()#printをリダイレクトする
    print('\n\n*********ポスト処理を実行中です。*************\n')
    import win32com.client#pywin32をインポート

#すでにExcelが起動されている場合はそのタスクが使われる
#エラー終了するとタスクは残ります
    try :
        xl = win32com.client.Dispatch("Excel.Application")
    except:
        print("can not invoke excel")
        exit()
    #動いている様子を見てみる
    xl.Visible = True
    os.chdir(project_file_path)
    file=os.path.join(project_file_path,"excel_post_export.xlsx")
    file.replace("/","\\") #なぜか逆スラッシュでないと動かない
    wb = xl.Workbooks.Open(file)
    # Excelシートオブジェクト
    ws = wb.Worksheets(1)

    # 指定したシートを選択
    # Select()の使用前にシートのActivate()が必要
    ws.Activate()

    for person in 全スタッフ:
        staff_name=staffdef[person]
        c=ws.Range("B1:B51").Find(staff_name)
        print(c,c.address,end='\n')
    # ブックをクローズ
    wb.Close()# ブックを保存せずにクローズ
    # Excel終了
    xl.Quit()
*********ポスト処理を実行中です。*************

部長1 $B$8
部長2 $B$12
部長(兼任) $B$16
副部長2 $B$20
副部長1 $B$24
医師2 $B$28
医師1 $B$32
新人医師2 $B$36
新人医師1 $B$40
解探索が終了しました。 7 (秒)
解が得られました。

0 件のコメント:

コメントを投稿