見出し画像

We Love Python (2) ~ネタ探しと試作


さて、何作ろうか?

と、ずっと考えていた時、大きな進展がありました。

職場でPython使ってOKの決裁が通りました。やったね!

仕事PCにPythonをインストールします。我が職場でこんな時には社内規定でアプリをPCにインストールしたいです、と決裁を上げる必要があります。
もしセキュリティ的にも規定的にも問題はなくも、上長に難癖をつけられて却下されることがあります。前回アイデア出し用にマインドマップツールを申請したときがそうでした。「君の仕事にとって余計なことだ」と。

今回の申請もそのリスクがありました。ですが、たまたま上長がバタバタしていたせいか、上長の上長が決裁してくれました。

「なぜPythonなのか?」と問われましたが、ええ語りましたよ私は。PythonはVBAと同等業務ができ、VBAより簡単であること。ライブラリの実績が他の追随を許さないこと。本業をもつ非プログラマに最適な言語であること。

そういうわけで、まずは業務アプリをちょっとずつ作成することで、上記のことを実証していこうと思います。

最初のアプリ作成テーマ

だるい定例作業を効率的にやるために、まずはメール周りから始めようと思います。OutlookメールをPythonから処理してみたいと思います。

準備

前回説明した「仮想環境の作成」「Jupyter Labのインストール」までできているとします。

仮想環境入ってJupyter Lab起動して・・・が毎回めんどくさく思い、以下のようなバッチファイルを作成しました。
test配下にstart_jupyter.batとして保存(置き場所・名前は任意)

@echo off

set VPATH="C:\Users\yochi\python\test"

cd %VPATH%
call venv\Scripts\activate.bat
jupyter lab
deactivate

activate.batを実行したあと、後続のコマンドを実行しようとしても仮想環境のコマンドプロンプトで止まってしまうので、call 文で呼び出しています。
jupyter labコマンドの代わりに完成したtest.pyなどを置くことで、仮想環境配下のpythonプログラムをバッチで起動できたりするので、大変便利です。

(この技は、ネットのどこかで読んだのですが、なぜcall 文を使うとうまくいくかは、activate.batをよく読んでおらずわかりません・・・)

もうひとつ、pythonプログラムのひな型を用意します。こちらはtestフォルダ内にtemplate.py という名前で保存します。

# template.py

def main():
    pass


if __name__ == "__main__":
    main()

pythonでmain関数を使う意味。今回は説明省略しますが、のちのちご利益があるよ。

以下、実際のプログラムをmain()関数の中にずらずら書いていきます。

最初のプログラム

OutlookのメールをCSVファイルに落とすことをやってみたいと思います。
「おいおい、そのぐらいVBA使えよ」と言われればその通りですが・・・

PythonからOutlookの機能を使うために、pywin32というモジュールを使用します。

pywin32はWin32 COMを呼び出すためのモジュールです。これを用いてWindowsそのものやOffice製品をAPIで呼び出して使用できます。
非常にメジャーなモジュールです。

インストールはpip コマンドを用いて行います。
事前に必ずtest用仮想環境をアクティベートしてください。

pip install pywin32

★Jupyter Labを導入状態では、すでにpywin32はインストールずみです。

これからのサンプルは、できる限りJupyter Labにて行っていきます。
まず上のtemplate.pyをuntitled.ipynb ファイルにコピペし、左ツリーでtest.ipynb とでもリネーム。

ここでOutlookを読み出すだけのプログラムを書きます。

# Outlook test
import win32com.client

def main():
    outlook = outlook_start()

def outlook_start():
    return win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

if __name__ == "__main__":
    main()

pywin32をpython で使用するときは、import win32comと書きます(パッケージとは別名)Outlookの呼び出しには import win32com.client とします。

ここではwin32comの構造は突っ込まず、こういうものだと受け入れます。(このままにしておくのはいけませんが、モジュールに構造があるんだよ、と頭の中にいれておきます)

outlook_start() という関数を定義し、その中でOutlook呼び出しの呪文を実行し返しています。これでのCOMオブジェクトの実体(インスタンス)が作成され、インスタンス変数を通じてメールの読み出し、書き込み、ひな型の作成・・・などができてしまうのです。

def outlook_start()    
    return win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

main() で直接やらずになんでこんな回りくどいことするの?
これは、のちのちOutlookの操作関数をいくつかつくるための布石です。業務的にまず自動読み込みを仕込みます。
(つづく)


いいなと思ったら応援しよう!