プログラム製作日記

世の中にないプログラムをつくれたらよいなと思いながらプログラムをしていくブログです

Visual StudioでPython (マルチプロセス05-共有ファイルによる異言語-PythonとC#-での作成プログラム間の通信)

マルチプロセスでのプロセス間でのデータの共有をためしてみました。

今回はPythonで作ったプログラムとC#で作ったプログラムを並列で動かし、共有ファイルを使ってデータのやり取りを試してみました。

PythonC#の両方のコード資産を同時に使いたいときに参考になるかと思います。

 

<Python側の動作の流れ>

example.txtというテキストファイルに、文字列を書き込み、その後、無限ループでexample.txtの内容読み込み、標準出力などに出力する。

 

<C#側の動作の流れ>

example.txtに指定した文字列を書き込む。

 

<成功した場合>

pythonで実行しているexample.txtの標準出力への出力内容が途中から書き換わる。

 

Pythonのプログラムは以下の通りです。

 

import mmap

f = open('example.txt', 'w')
f.write('555')

f.close()

with open("example.txt", "r+b") as f:
    mm = mmap.mmap(f.fileno(), 0)

    while True:
        mm.seek(0)
        mode=mm.readline()
        print(mode)

 

 >C#で製作した画面は以下の通りです。


 >C#のプログラムは以下の通りです。

button1_Clickが追加したコードです。

他は自動生成される内容やおまじない。

 

Form.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

 

namespace TestSharedFileWithPython
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string filepath = "example.txtの絶対パス";

            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); // .Net CoreではShift-JISを.NET Frameworkと同じコードでは使えないので、このコードが必要。

 

            try
            {
                Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");

                //ファイルをオープンする
                using (FileStream fs = new FileStream(filepath,
                                                        FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    using (StreamWriter sw = new StreamWriter(fs, sjisEnc))
                    {
                        sw.Write(textBox1.Text);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

 

 

>スタートアッププロジェクトの設定

ソリューションエクスプローラ上のソリューションを右クリックして表示されるコンテキストメニュー内に"スタートアッププロジェクトの設定"

という項目があるので、

そこでマルチスタートアッププロジェクトを選択し、

並列して実行したいPythonC#のプロジェクトのアクションを"開始"に設定してOKボタンを押してください。

 

 

この設定をした後でデバックの実行を開始すれば、並列してPythonC#のプロジェクトが実行されます。

 

>実行結果

実行直後のPythonプログラムの出力は以下の通り。

 

並列起動しているC#のプログラムでtttと書き込むと、

 

Pythonプログラムの出力内容が書き換わります。

 

今回は以上になります。

 


参照リンク

 

基本的な所ですが、 button1_ClickとClick eventとのつなげ方は以下が参考になります。

デザイナー上で配置したボタンをクリックすれば元になるbutton1_Clickは自動で生成されますが念のため。

csharp.keicode.com

 以下はその他の参照リンク

www.javadrive.jp

qiita.com

mogmo811.hatenablog.com

atmarkit.itmedia.co.jp

 


開発環境: Visual Studio Community 2019

OS: Windows 10 Pro 64bit バージョン1909

使用言語:Python3.7 (64bit), C#

 

Python 16.10.21111.19

Python - Conda サポート 16.10.21111.19

Python - Django サポート 16.10.21111.19

Python - プロファイル サポート 16.10.21111.19

 

.NET Core 3.1

 

パソコン性能: CPU Intel Core i5-4310M 2.70GHz, メモリ: 8GB

 

Visual StudioPythonのライブラリを追加する方法は以下が参考になります。

docs.microsoft.com

*このページで紹介されているのはあくまでサンプルプログラムで、実際に製品のコードを作成される場合は適切なエラー処理などを実装するようにお願いします。また、動作環境によっては想定した動きにならない場合があります。適宜、実行環境に合わせてプログラムの内容を最適化ください。

 

 ランキングに参加してます。

よかったらクリックをお願いします。

にほんブログ村 IT技術ブログ Tipsへ
にほんブログ村