VB のたまご

作成日: 2017/08/13, 更新日: 2017/08/13


VB.NET から Python を呼んで、戻り値を受け取る

  •  今回はとてもシンプルで、VB.NET のソース上から Python のソースを指定して Python を実行。 その処理結果を、VB.NET 側で受け取るまでのサンプルです。

  •  やり方は、Windows 環境下でコマンドプロンプトを呼び出して、その結果を受け取るのと同じ方法です。 すなわち、Process クラスと ProcessStartInfo クラスを使った呼び出し方、受け取り方です。

  • ・環境
  • ・Linux 17.04
  • ・Python3
  • ・.NET Core 2 Preview 2
  • ・Visual Studio Code (Python も VB.NET も、VSCode で編集します)


dotnet コマンドで、ひな形ソース生成& VB.NET 変換

  •  (追記)オプション指定することで、直接 VB.NET 用ソースを生成することが可能です。 よって、以下の変換作業は不要です(やっても良い)。
  • $ dotnet new Console -lang VB -o vbapp1
    

  •  dotnet コマンドでソース生成したもの(C# ソース)を、VB ソースに直します。
  • $ dotnet new Console -o vbapp1
    $ cd vbapp1/
    $ mv vbapp1.csproj vbapp1.vbproj 
    $ mv Program.cs Program.vb 
    

  •  VSCode を起動します。
  • $ code .
    

  •  以降は、VSCode 上で作業を進めます。構成(launch.json)とタスクランナー(tasks.json)は両方とも「.NET Core」を指定します。 launch.json のパス記載部分は、テンプレートから実際の実行ファイルパスに書き換えます。
  • "program": "${workspaceRoot}/bin/Debug/netcoreapp2.0/vbapp1.dll",
    

  •  また、tasks.json の Command キーの値を「dotnet build」に変更します。
  • "command": "dotnet build",
    


Python 側

  •  エクスプローラーに表示されている VBAPP1 フォルダより、「hello.py」というファイル名で新規作成します。 文字列表示と、足し算した結果を表示するだけのコードです。

  •  hello.py
  • i1 = 1
    i2 = 2
    i3 = i1 + i2
    print("Hello, World from python code!")
    print("result is {0}".format(i3))
    


VB.NET 側

  •  「Program.vb」を開いて、C# ソースを消して VB.NET ソースを書いていきます。 今回は、Python を呼び出す担当を受け持つクラスと実行クラスを分けて作成しました。

  •  Class1.vb
  • ' 全てのインポート文を消してもビルドが通る、「Just My Code」が有効だからとのこと。自動インポートのことか?
    Imports System
    Imports System.Collections.Generic
    Imports System.Linq
    Imports System.Diagnostics
    
    Public Class Class1
    
        Public Sub New()
        End Sub
    
        Public Sub CallTest1()
    
            Dim psi = New ProcessStartInfo With
            {
                .FileName = "python",
                .Arguments = "hello.py",
                .RedirectStandardOutput = True
            }
    
            Dim ps = Process.Start(psi)
            Dim result = ps.StandardOutput.ReadToEnd()
            Console.WriteLine(result)
    
        End Sub
    
    End Class
    

  •  Program.vb
  • Imports System
    
    Public Class Program
    
        Public Shared Sub Main(args As String())
            
            ' Console.WriteLine("Hello, VB.NET on .NET Core used vscode!")
            Dim obj = New Class1
            obj.CallTest1()
            
        End Sub
        
    End Class
    

  •  実行結果
  • ~
    Hello, World from python code!
    result is 3
    ~
    


まとめ

  •  Windows 版の VB.NET の書き方そのままで、Linux でも動かすことが出来ました!すごいですね! データ分析が得意な Python と連携することで、例えば機械学習を利用したり、巨大データを捌いたり、夢が広がりますw