以前作っていたモニタリングするアプリケーションについて
このアプリでは、通知やメッセージボックスなどの.NET系、OpenHardwareMonitorをPython.NETを使って呼び出しています。
Python.NETというのは、公式docにもあるように
Python.NET is a package that gives Python programmers nearly seamless integration with the .NET Common Language Runtime (CLR) and provides a powerful application scripting tool for .NET developers. It allows Python code to interact with the CLR, and may also be used to embed Python into a .NET application.
約(DeepL):
Python.NET は、Pythonプログラマに .NET Common Language Runtime (CLR) とのほぼシームレスな統合を提供し、.NET 開発者に強力なアプリケーションスクリプティングツールを提供するパッケージです。PythonのコードがCLRと対話することを可能にし、Pythonを.NETアプリケーションに組み込むために使用されることもあります。
要は、.NETの関数やクラスなどをpythonで使えるようにしたものです。
僕自身は大学での測定装置用ソフトウェアを作っていたときに出会いました。
使い方
最新版(2022/11/24時点)ではpython 3.7~3.11で対応しています。
以下のコマンドでインストールできます。
pip install pythonnet
使う際は、次のコードをはじめに書きます。Linux/Macではmonoが、Windowsでは.NET Frameworkが使えます。
import clr
v3.0以降では環境変数を変えるかpythonnet.load
を使うと、.NET Coreが使えるようになります。
import pythonnet
pythonnet.load('coreclr')
# or
import os
os.environ['PYTHONNET_RUNTIME'] = 'coreclr'
# ________________________________________
import clr
使いたい関数などを使う場合は、そのアセンブリ名を追加する必要があります。例えば、System.ComponentModel.Primitives
のContainer
を使いたい場合であれば、
clr.AddReference('System.ComponentModel.Primitives')
from System.ComponentModel import Container
ちなみに公式ドキュメントとかにもないですが、アセンブリがどこにあるかを調べたいときは次で取れます。
directory = clr.FindAssembly('System.ComponentModel.Primitives')
print(directory) # 'C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\\\System.ComponentModel.Primitives.dll'
例
とりあえずなんか呼び出してみましょう。
Windowsの通知センターにタイトルがpython
でHello World!
を出すプログラムを作ってみます。
c#などを触った方がいれば、それと同じことをしてるだけです。
import os
import time
from typing import Optional
import clr
# reference追加
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.ComponentModel.Primitives')
clr.AddReference('System.Drawing')
# import
import System.Windows.Forms as Forms
from System.ComponentModel import Container
from System.Drawing import Icon, SystemIcons
container = Container()
notifyicon = Forms.NotifyIcon(container)
def show_notification(
title: str,
message: str,
app_icon: Optional[str] = None) -> None:
app_icon = app_icon
if app_icon is not None and os.path.exists(app_icon):
icon = Icon(app_icon)
else:
icon = SystemIcons.Application # なければ、デフォルトアイコン
notifyicon.Icon = icon # アイコンをセット
notifyicon.BalloonTipTitle = title # タイトルを決定
notifyicon.BalloonTipText = message # 表示メッセージ
notifyicon.Visible = True # 見えるように
notifyicon.ShowBalloonTip(1) # 表示時間(osの中身で決まってるので、引数はあんまし意味がない)
if __name__ == '__main__':
# icon(任意)
icon = './shared.ico' # .icoファイルである必要あり
show_notification(title = 'python', message='hello world!', app_icon=icon)
time.sleep(7)
container.Dispose() # 7s程度待たないとアイコンがバグる
こんな感じで通知もできるわけです(同じことはpythonのplyerでもできます)。
C#等で自分の作ったプログラムをPythonで使いたい場合は、こういうPython.NETを使ってみてはどうでしょうか。
最後に、今回は.NETをPythonで呼び出しましたが、逆もできます。こちらについては、以下の記事を参照してください。
C#にpythonで作った処理を組み込む【pythonnet準備+確認編 2021年2月最新