質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1040閲覧

'ScriptRuntime' に 'GetFunction' の定義が含まれていません。

kkk00

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2023/04/15 17:22

編集2023/04/16 12:25

実現したいこと

C#のファイルでpythonファイルを実行したい

前提

参考にしたサイトは以下になります。
https://tpsxai.com/preparing_pythonnet/
自分なりに参考にしたサイトを見てコーディングしたのですがエラーが発生します。

またわからない問題が二つ発生しています。
①デバックした際に以下のエラーが発生します。

発生している問題・エラーメッセージ

System.DllNotFoundException: 'DLL 'python38' を読み込めません:指定されたモジュールが見つかりません。 (HRESULT からの例外:0x8007007E)'

このエラーが PythonEngine.PythonHome = PYTHON_HOME;の部分を指しています。

②pythonファイルで作成したクラスを使用したいのですが、using (Py.GIL())の処理部分をどうしようすればいいのかわかりません。
この質問に関しては大雑把な質問で申し訳ないのですがご教授いただければ幸いです。

該当のソースコード

public Form1()
{

InitializeComponent(); // // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。 // } /// <summary> /// プロセスの環境変数PATHに、指定されたディレクトリを追加する(パスを通す)。 /// </summary> /// <param name="paths">PATHに追加するディレクトリ。</param> public static void AddEnvPath(params string[] paths) { var envPaths = Environment.GetEnvironmentVariable("PATH").Split(Path.PathSeparator).ToList(); foreach (var path in paths) { if (path.Length > 0 && !envPaths.Contains(path)) { envPaths.Insert(0, path); } } Environment.SetEnvironmentVariable("PATH", string.Join(Path.PathSeparator.ToString(), envPaths), EnvironmentVariableTarget.Process); }

.
.
.
省略

private void Form1_Load(object sender, System.EventArgs e)
{

// *-------------------------------------------------------* // * python環境の設定 // *-------------------------------------------------------* // python環境にパスを通す // TODO: 環境に合わせてパスを直すこと var PYTHON_HOME = Environment.ExpandEnvironmentVariables(@"C:\Users\ユーザー名\anaconda3\envs\仮想環境フォルダ"); // pythonnetが、python本体のDLLおよび依存DLLを見つけられるようにする //上記で作成したAddEnvPath()メソッドを使用する AddEnvPath( PYTHON_HOME, Path.Combine(PYTHON_HOME, @"Library\bin") ); // python環境に、PYTHON_HOME(標準pythonライブラリの場所)を設定 PythonEngine.PythonHome = PYTHON_HOME; // pythonの処理をする=numpyの定義とバージョンをラベルに表示させる using (Py.GIL()) { }

試したこと

プロジェクトの参照を自分なりに調べて確認したのですが、その問題は当てはまらなかった気がします。
プログラミング初心者なので、自分の説明不足、調べ不足等あるかと思いますが、なかなか解決できないため質問させていただきます。
どうかよろしくお願いします。

補足情報(FW/ツールのバージョンなど)

.NETFrameWork4.7.2 visualstudio2022

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2023/04/15 21:46

> var func = engine.Runtime.GetFunction("pythonのメソッド名"); どちらのサイトを参考にされたのでしょうか?(参考サイトは質問に明記してください) ScriptSourceやdynamicを使う例はありますが、GetFunctionというのは見当たらないのですが... [c# ironpython - Google 検索](https://www.google.co.jp/search?q=c%23+ironpython)
退会済みユーザー

退会済みユーザー

2023/04/15 21:48

開発環境を質問欄を編集して追記してください。(例: Windows 10 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています・・・とか)
Zuishin

2023/04/15 23:01

ChatGPT かもしれませんね。
guest

回答3

0

ベストアンサー

①デバックした際に以下のエラーが発生します。

@"C:\Users\ユーザー名\anaconda3\envs\仮想環境フォルダ"
まさかこのままってことはないですよね!?
「python38.dll」があるフォルダを指定してください。

例えばC:\Users\hoge\anaconda3\envs\fuga\python38.dllにあったら、@"C:\Users\hoge\anaconda3\envs\fuga"にするということです。

②pythonファイルで作成したクラスを使用したいのですが、using (Py.GIL())の処理部分をどうしようすればいいのかわかりません。

こちらをお借りしました。
.NET (C#)からpythonを呼び出す - Qiita

  1. プロジェクトに「my_awesome_lib」フォルダを追加する
  2. my_awesome_libフォルダに「テキストファイル」を追加する
  3. ファイル名を「my_math.py」に変更する
  4. ↓のコード(my_math.py)をコピペする
  5. my_math.pyのプロパティを開き「出力ディレクトリにコピー」を「新しい場合はコピーする」にする

フォルダ名やファイル名も変えて構いませんが、Py.Import("my_awesome_lib.my_math")のところも変えてください(WindowsFormsApp1.exeがあるフォルダの下のhoge\fuga.pyにあるなら、Py.Import("hoge.fuga")

既存の.pyを追加してもいいですが、「新しい場合はコピーする」はしてください。
もちろんクラス名やメソッド名・引数が違う場合は、回答のC#コードのままでは使えません。

cs

1using System; 2using System.IO; 3using System.Windows.Forms; 4using Python.Runtime; 5 6namespace Qeijlj235o1hdkv 7{ 8 public partial class Form1 : Form 9 { 10 private TextBox textBox1; 11 12 public Form1() 13 { 14 InitializeComponent(); 15 16 FormClosing += Form1_FormClosing; 17 18 textBox1 = new TextBox 19 { 20 Dock = DockStyle.Fill, 21 Multiline = true, 22 Parent = this, 23 }; 24 textBox1.Click += TextBox1_Click; 25 26 27 var PYTHON_DLL_PATH = @"C:\Users\自分のユーザ名\anaconda3\envs\DIcom\python38.dll"; 28 Runtime.PythonDLL = PYTHON_DLL_PATH; 29 30 var PYTHON_HOME = @"C:\Users\自分のユーザ名\anaconda3\envs\DIcom\"; 31 Environment.SetEnvironmentVariable("PYTHONHOME", PYTHON_HOME, EnvironmentVariableTarget.Process); 32 PythonEngine.PythonHome = PYTHON_HOME; 33 34 var MODULE_PATH = @"C:\Users\自分のユーザ名\anaconda3\envs\DIcom\"; 35 PythonEngine.PythonPath = string.Join(Path.PathSeparator.ToString(), 36 PythonEngine.PythonPath, 37 Path.Combine(MODULE_PATH, @"Lib\site-packages")); 38 39 PythonEngine.Initialize(); 40 41 using (Py.GIL()) 42 { 43 dynamic np = Py.Import("numpy"); 44 dynamic np_version = np.__version__; 45 textBox1.Text += $"numpyバージョン:{np_version}\r\n"; 46 } 47 } 48 49 private void TextBox1_Click(object sender, EventArgs e) 50 { 51 using (Py.GIL()) 52 { 53 dynamic myMath = Py.Import("my_awesome_lib.my_math"); 54 dynamic calculator = myMath.Calculator(5, 7); 55 56 textBox1.Text += $"5 + 7 = {calculator.add()}\r\n"; 57 textBox1.Text += $"sum(1,2,3,4,5) = {myMath.Calculator.sum(new[] { 1, 2, 3, 4, 5 })}\r\n"; 58 dynamic dict = myMath.GetDict(); 59 textBox1.Text += $"{dict[3]}\r\n"; 60 } 61 } 62 63 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 64 { 65 PythonEngine.Shutdown(); 66 } 67 } 68}

python:my_math.py

1class Calculator: 2 def __init__(self, x, y): 3 self.x = x 4 self.y = y 5 6 def add(self): 7 return self.x + self.y 8 9 @staticmethod 10 def sum(num_list): 11 return sum(num_list) 12 13def GetDict(): 14 return { 15 0 : "this", 16 1 : "is", 17 2 : "my", 18 3 : "dictionary", 19 }

NuGet Gallery | pythonnet 3.0.1

実行状態

投稿2023/04/16 21:32

編集2023/04/26 01:31
TN8001

総合スコア9678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkk00

2023/04/24 12:54

バタバタしており、大変お返事遅くなってしまい申し訳ありません。 visual studioのプロジェクトファイルの下に任意のフォルダを作成しその下にテキストファイルの拡張子を.pyに変更し保存しました。 ここでご質問なのですがほかのメソッド内でusing(Py.GIL())以下のコードを使用したい場合はどうすればいいのでしょうか?
TN8001

2023/04/24 14:31

> ほかのメソッド内でusing(Py.GIL())以下のコードを使用したい場合はどうすればいいのでしょうか? 「ほかのメソッド」というと、button1_Clickみたいな話ですか? そこにもusing (Py.GIL())以下を書いてもいいですし、 kkk00さんが挙げている参考ページでは「private dynamic np;」と、フィールドにとって使いまわしています(よくわかっていませんが、こういう使い方をしてもいいのかもしれません) 「PythonEngine.Shutdown();」は、Form.Closingにでも移動してください(Shutdown後に使うとエラーになります)
kkk00

2023/04/25 17:09 編集

本当に丁寧に教えてくださりありがとうございます。 今後ともわからないことがあればご教授いただければ幸いです。 最後に、お返事大変遅くなってしまい申し訳ありませんでした。 自分で実行できずともその趣旨を伝えるコメントを返すべきだったと反省しております。以後気を付けます。
kkk00

2023/04/25 17:11

public Form1() { // // Windows フォーム デザイナ サポートに必要です。 // InitializeComponent(); // // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。 // var textBox = new TextBox { Dock = DockStyle.Fill, Multiline = true, Parent = this, }; // python環境にパスを通す // TODO: 環境に合わせてパスを直すこと var PYTHON_HOME = Environment.ExpandEnvironmentVariables(@"C:\Users\自分のユーザ名\anaconda3\envs\DIcom"); AddEnvPath(PYTHON_HOME, Path.Combine(PYTHON_HOME, @"Library\bin")); PythonEngine.PythonHome = PYTHON_HOME; PythonEngine.Initialize(); } private static void AddEnvPath(params string[] paths) { var envPaths = Environment.GetEnvironmentVariable("PATH").Split(Path.PathSeparator).ToList(); foreach (var path in paths) { if (path.Length > 0 && !envPaths.Contains(path)) { envPaths.Insert(0, path); } } Environment.SetEnvironmentVariable("PATH", string.Join(Path.PathSeparator.ToString(), envPaths), EnvironmentVariableTarget.Process); } このようにしているのですがエラーが発生してしまいました。 Python.Runtime.BadPythonDllException: 'Runtime.PythonDLL was not set or does not point to a supported Python runtime DLL. See https://github.com/pythonnet/pythonnet#embedding-python-in-net' 調べてみたところPythonと.NETの間での通信が失敗し、アプリケーションが正常に動作していないという趣旨のエラーでした。
TN8001

2023/04/26 01:31

> このようにしているのですがエラーが発生してしまいました。 すいません。 質問の参考コードと回答の参考コード、書いてあること全く違うんですね...(よく見てませんでした^^; 質問の参考コードベースに変えました。
kkk00

2023/04/26 17:34

できました!! 初心者で至らないことも多々あったかと思いますが、本当に最後までご丁寧にありがとうございました!!!
guest

0

TN8001様をベストアンサーにしたいのですが、どうすれば良いのでしょうか?

投稿2023/04/16 00:38

kkk00

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2023/04/16 00:50

ここは回答欄なのでこう言った内容は「質問へのコメント」にお願いします。
guest

0

お恥ずかしながらchatgptを使用しています。
TN8001様がおっしゃる通りそもそもGetfunction自体が間違っていたようです。
今後は自分でサイトを参考にしサイトurlと共に質問したいと思います。
一度、自分でサイトを見ながらやってみたいと思います。ご迷惑をおかけし申し訳ありませんでしたm(__)m

投稿2023/04/16 00:20

kkk00

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2023/04/16 00:48

> お恥ずかしながらchatgptを使用しています。 いえ別に恐縮されないで結構です。 質問内に「ChatGPTを参考に」という一文があればよかったです^^; > 一度、自分でサイトを見ながらやってみたいと思います。 結構古い情報もあるので、場合によってはもう使えなかったりするかもしれません。 うまくできたら回答を編集し成功したコード等を載せ、質問を「解決済」にしてください。 うまくいかない場合は参考サイトや環境・バージョン等を質問に追記してください。 [ヘルプ|質問をした後に自己解決してしまった](https://teratail.com/help#resolve-myself) [ヘルプ|質問するときのヒント](https://teratail.com/help/question-tips)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問