外部呼出し(VB.NET⇒)

お友達と会話していて、Pythonスクリプトを外部から呼ぶ話が出たので、簡易な呼び出し(VB.NET(ASP.NET)⇒Python)を行う処理を掲載します。

例えばASP.NET等で簡単なWebページを作成し、画面INPUTより、Pythonスクリプトによる計算を実施し、結果を返す等に応用できるかと思います。

  • Python側(呼び出し先)[callTest.py]
import sys

if len(sys.argv) == 4:

    #引数を受け取る
    param1 = int(sys.argv[1]) 
    param2 = int(sys.argv[2])
    param3 = int(sys.argv[3])

    #引数より計算処理を実施
    calcVal = param1 + param2 + param3

    #結果を返却
    print("calcResult {0}".format(calcVal))

単純ですが、sys.argvにてコマンドパラメタを取得し、1~3の項目(0はファイル名)を加算し、printにて呼び出し元に情報を返却しています。複数結果が必要な場合は、改行して出力するか、カンマ区切りやパイプ区切り等で文字として返却し、VB.NET側で分解すれば問題ないかと思います。

  • VB.NET側(呼び出し元)[callFromTest.vb][CallPythonClass.vb]
Imports System

Public Class callFromTest

    Public Shared Sub Main(args As String())
        
        'Python呼び出しクラスをインスタンス化し処理する
        Dim callPython = New CallPythonClass

        'Pythonスクリプト外部呼出しを実行
        callPython.callExecute()
    End Sub
End Class
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Diagnostics

Public Class CallPythonClass

    Public Sub New()
    End Sub

    Public Sub callExecute()

        'Pythonインタプリタパス
        Dim pythonPath As String = "E:\test\Anaconda3\python.exe"

        'Pythonスクリプトパス
        Dim pythonFilePath As String = "E:\test\Anaconda3\callTest.py"

        '引数リストを作成する
        Dim paramList = New ArrayList()

        paramList.Add(pythonFilePath)
        paramList.Add("1000")
        paramList.Add("2000")
        paramList.Add("2000")

        'プロセス開始情報クラスを設定する。
        '引数配列よりコマンド配列(空白繋ぎ)に変換し設定する
        Dim psi = New ProcessStartInfo(pythonPath) With
        {
            .Arguments = String.Join(" ", paramList),
            .RedirectStandardOutput = True,
            .UseShellExecute = False
        }

        'プロセスを実行する。
        Dim ps = Process.Start(psi)

        '結果を取得する。
        Dim calcResult = ps.StandardOutput.ReadToEnd()

        'プロセス終了を待機する
        ps.WaitForExit()
        ps.Close()

        '結果出力
        Console.WriteLine(calcResult)
    End Sub

End Class

上記はVB.NET(ASP.NET)ですが、C#でも書き方だけ変えれば同様の記載で動作します。CallPythonClassクラスにて、プロセスクラスを利用し、pythonスクリプトの外部呼出しを行っています。結果はStandardOutputにて文字列として取得しています。