LoginSignup
14
15

More than 1 year has passed since last update.

Python .NETについて

Last updated at Posted at 2021-12-09

以前作っていたモニタリングするアプリケーションについて

このアプリでは、通知やメッセージボックスなどの.NET系、OpenHardwareMonitorPython.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.PrimitivesContainerを使いたい場合であれば、

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の通知センターにタイトルがpythonHello 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程度待たないとアイコンがバグる

結果:
名称未設定.png

こんな感じで通知もできるわけです(同じことはpythonのplyerでもできます)。
C#等で自分の作ったプログラムをPythonで使いたい場合は、こういうPython.NETを使ってみてはどうでしょうか。

最後に、今回は.NETをPythonで呼び出しましたが、逆もできます。こちらについては、以下の記事を参照してください。
C#にpythonで作った処理を組み込む【pythonnet準備+確認編 2021年2月最新

14
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
15