忍者ブログ
Slic3rの設定についてまとめてます。Slic3rの日本語版が見当たらなかったので、使い方をまとめました。 最近はC#のメモ帳代わりになってます。

C# | C#から呼び出したPythonをVisualStudio上でデバッグ

スポンサーリンク
私、開発環境はVisualStudioしか知りません。
Pythonも知りません。

Python流行ってそうだから少しさわっておくか―と思って、以下のテーマでさわってみた。

やりたい事
  •  PythonのライブラリをC#から使いたい。
取りあえずの方針
  •  C#からPythonで書かれたコードを呼び出す。
  •  C#から呼び出されたPythonのコードをVisualStudio上でデバッグ。

「取りあえずの方針」までは出来たので記録
以下VisualStudio2015を使用


Pythonのプロジェクト
取りあえず、VisualStudioにPythonのプロジェクトを追加する。
Pythonのコードはこのプロジェクトの中で管理(デバッグ)したい。

ソリューションのメニューから [追加] → [新しいプロジェクト] を選択して、 [Python] プロジェクトの [Python Application] を選択。

テンプレートが表示されない場合は [Install Python Tools for Visual Studio] を選択してインストールすれば見れるはず。
追加されたPythonのプロジェクトでコードを書く。テストコードとして、取りあえずこんな感じ。

class PyClass: 
    placeCode=203 
    year=1904 
 
def getObject(): 
       return PyClass()
C#からは、このコードが書かれているファイルを指定して実行することになる。


C#プロジェクト
ソリューションにC#のプロジェクトを追加。
cRunPythonModelクラスでPythonを呼び出すとするとこんな感じ。

    public class cRunPythonModel
    {
        public void Run(string path)
        {
            //スクリプトのランタイムオプション
            Dictionary<string, object> options = new Dictionary<string, object>();
#if DEBUG
            //デバッグ実行の場合スクリプトもデバッグモードにする。
            options["Debug"] = true;
#endif
            //オプションを指定してPythonのランタイムを作成する。
            ScriptRuntime pyRuntime = Python.CreateRuntime(options);

            //Pythonのファイルを指定する。
            //ScriptScopeの型は実行時に解決される。
            dynamic py = pyRuntime.UseFile(path);

            //Pythonのコードに書かれているメソッドを呼び出す。
            //戻り値の型は実行時に解決される。
            dynamic PyClassObject = py.getObject();

            //Pythonからの戻り値を使用して何らかの処理。
            Console.WriteLine("{0},{1}", PyClassObject.placeCode, PyClassObject.year);
        }
    }
optionsでデバッグオプションを追加するのがポイントらしい。
Pythonの戻り値をdynamicで受けて実行時に解決させる。

「これでPythonのコード内でブレイクで出来るだろ」と思ったけど出来ない


VisualStudioのデバッグオプション
上のcRunPythonModelで Run(string path)を実行すると、Pythonのコードもステップ実行されてているみたいだったけど、ブレイク出来ない。
よくよく見てみると、VisualStudio様は出力ウィンドウに

「モジュールは最適化されていて、デバッグ オプションの [マイ コードのみ] 設定が有効になっています」

と、出していらっしゃいました。
VisualSutioのデバッグオプションを指定しないといけないらしい。

VisualSutioのメニューから [デバッグ] → [オプション] を選択してオプションダイアログを表示ささる。
オプションダイアログの [デバッグ] → [全般] で デバッグ全般に関する設定画面を表示させる。
[マイ コードのみを有効にする] のチェックを外して [OK]



デバッグ実行
ようやく出来た。
Pythonのコードでブレイク
 

C#側で戻り値のデバッグ


雑感
C#側で .py のファイルパスを指定しているんだけど、C#のプロジェクトでPythonのプロジェクトを参照しているわけじゃない。となると、.py ファイルを実行環境に配置するのをうまいことやってやりたくなる。
Python側に引数渡すのもいずれやってみる。
Pythonの戻り値をC#の型に変換するには、こんな感じでやるしかないのかな?

 
public class CsClass
    {
        public CsClass(dynamic PyClassObject)
        {
            placeCode = PyClassObject.placeCode;
            year = PyClassObject.year;
        }

        public int placeCode;
        public int year;
    }

まぁ、いずれにせよPythonさわりながら少しずつやってみる。


関連記事