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

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

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

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

Python

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

Q&A

解決済

1回答

792閲覧

PythonのImage.open(path)をc#で読み出すとエラーとなる

sadokazu

総合スコア14

C#

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

Python

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

1グッド

0クリップ

投稿2023/05/11 00:33

編集2023/05/11 02:21

発生状況

Pythonで下記コードを実行すると正常に画像が読み込めるが、
これをc#側で読み出すとImage.open部分で固まるような挙動となる

python

1from PIL import Image 2 3try: 4 path = 'c:/data/test.bmp' 5 img =Image.open(path) 6except Exception as e: 7 print(e)

test.bmpは200×200×3のbmpファイルになります
パス文字に問題があるのかと思い、いろいろと試しましたがPython側だけの実行では何の問題も発生しないが、c#かからPythonを実行すると正常に動きません

原因がわからず困り果てております。
何が問題なのが教えて頂けないでしょうか?

追記

Anaconda仮想環境でpythonを構築し、その仮想環境のpythonを呼び出し
c#側からProcessでpython.pyを実行します

c#

1// Pythonインタープリタのパス 2var python_InterpreterPath = $"{仮想環境パス}\\python.exe"; 3 4if (System.IO.File.Exists(python_InterpreterPath)) { 5 // Pythonスクリプトのパス 6 // .pyが存在する場所 7 var python_ScriptPath = "test.py"; 8 9 10 // Pythonスクリプトに渡す引数 11 var arguments = new List<string> 12 { 13 python_ScriptPath , 14 }; 15 16 var process = new Process() { 17 StartInfo = new ProcessStartInfo(python_ScriptPath) { 18 UseShellExecute = false, 19 CreateNoWindow = true, 20 RedirectStandardOutput = true, 21 RedirectStandardError = true, 22 RedirectStandardInput = true, 23 24 Arguments = string.Join(" ", arguments), 25 }, 26 }; 27 28 29 process .OutputDataReceived += OnDataReceived_Train; 30 process .ErrorDataReceived += OnErrorReceived_Train; 31 process .EnableRaisingEvents = true; 32 process .Exited += new EventHandler(OnExited_Train); 33 34 // Process Start ---------- 35 process .Start(); 36 37 process .BeginOutputReadLine(); 38 process .BeginErrorReadLine(); 39} 40

実行は正常にされますがImage.open部で止まるような挙動となります

テスト環境追記

python側でメインスレッドでは問題無く読み出し出来ることが確認出来ました。
(状況をうまく伝えることが出来る申し訳ありません)
スレッドプールで上記を記載するとpython単体での実行は問題無いが、c#側からの読み出して固まることがわかりました

python

1def testfunc(): 2 path = 'C:/data/test.bmp' 3 try: 4 img = Image.open(path) 5 print('Image Read comp') 6 except Exception as e: 7 print(log + 'Error', e) 8 9if __name__ == "__main__": 10 11 # Thread Poolを作成 12 thread_pool = ThreadPoolExecutor(max_workers=5) 13 thread_pool.submit(testfunc)

自己解決

最小構成プログラムを作成して実行したところ、
c#側からスレッドプールで実施されている画像読み出しを行うことが出来ました
コードを記載いたします
お手数おかけして大変申し訳ありませんでした

実験コードでは上手くいったので、何が原因で問題が発生したのかを突き止めたいと思います
ご協力頂きありがとうございました

python

1# -*- coding: utf-8 -*- 2 3from PIL import Image 4import cv2 5import imageio 6from concurrent.futures import ThreadPoolExecutor 7 8def testfunc(): 9 path = 'C:/data/test.bmp' 10 print(path) 11 try: 12 img = imageio.v2.imread(path) 13 print('Image Read comp cv2') 14 15 img = cv2.imread(path) 16 print('Image Read comp cv2') 17 18 img = Image.open(path) 19 print('Image Read comp') 20 21 except Exception as e: 22 print(e) 23 24 25if __name__ == "__main__": 26 27 print('Hello Python') 28 29 # Thread Poolを作成 30 thread_pool = ThreadPoolExecutor(max_workers=5) 31 thread_pool.submit(testfunc) 32 33 34 print('Python Finish') 35

c#

1using System; 2using System.Collections.Generic; 3using System.Data; 4using System.Diagnostics; 5using System.Linq; 6using System.Text; 7using System.Threading.Tasks; 8using System.Windows; 9using System.Windows.Controls; 10using System.Windows.Data; 11using System.Windows.Documents; 12using System.Windows.Input; 13using System.Windows.Media; 14using System.Windows.Media.Imaging; 15using System.Windows.Navigation; 16using System.Windows.Shapes; 17 18namespace WpfApp1 19{ 20 /// <summary> 21 /// Interaction logic for MainWindow.xaml 22 /// </summary> 23 public partial class MainWindow : Window 24 { 25 26 private void OnExited_Train(object? sender, EventArgs e) 27 { 28 } 29 30 /// <summary> 31 /// イベントハンドラ 標準出力用 32 /// RedirectStandardOutput = True 33 /// OutputDataReceivedイベントハンドラ追加 34 /// </summary> 35 /// <param name="sender"></param> 36 /// <param name="e"></param> 37 private void OnDataReceived_Train(object sender, DataReceivedEventArgs e) 38 { 39 if (e.Data != null) { 40 Debug.WriteLine(e.Data); 41 } 42 } 43 44 /// <summary> 45 /// イベントハンドラ エラーメッセージ用 46 /// RedirectStandardError = True 47 /// ErrorDataReceivedイベントハンドラ追加 48 /// </summary> 49 /// <param name="sender"></param> 50 /// <param name="e"></param> 51 private void OnErrorReceived_Train(object sender, DataReceivedEventArgs e) 52 { 53 if (e.Data != null) { 54 Debug.WriteLine(e.Data); 55 } 56 } 57 58 public MainWindow() 59 { 60 InitializeComponent(); 61 62 63 // Pythonインタープリタのパス 64 var python_InterpreterPath = $@"C:\Users\******\anaconda3\envs\tf2_10_0_mkl_py39\python.exe"; 65 66 if (System.IO.File.Exists(python_InterpreterPath)) { 67 // Pythonスクリプトのパス 68 // .pyが存在する場所 69 var python_ScriptPath = "PythonApplication1.py"; 70 71 72 // Pythonスクリプトに渡す引数 73 var arguments = new List<string> 74 { 75 python_ScriptPath, 76 }; 77 78 var process = new Process() { 79 StartInfo = new ProcessStartInfo(python_InterpreterPath) { 80 UseShellExecute = false, 81 CreateNoWindow = true, 82 RedirectStandardOutput = true, 83 RedirectStandardError = true, 84 RedirectStandardInput = true, 85 86 Arguments = string.Join(" ", arguments), 87 }, 88 }; 89 90 91 process.OutputDataReceived += OnDataReceived_Train; 92 process.ErrorDataReceived += OnErrorReceived_Train; 93 process.EnableRaisingEvents = true; 94 process.Exited += new EventHandler(OnExited_Train); 95 96 // Process Start ---------- 97 process.Start(); 98 99 process.BeginOutputReadLine(); 100 process.BeginErrorReadLine(); 101 102 } 103 104 } 105 } 106} 107
epistemeを押しています

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

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

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

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

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

can110

2023/05/11 00:51

「これをc#側で読み出す」や「c#かからPythonを実行する」といったこと含め、状況がよく分かりません。 C#側コードや何をどのように実行しているのかといったことを記載ください。
退会済みユーザー

退会済みユーザー

2023/05/11 01:09

開発環境を質問欄を編集して追記してください。(例: Windows 10 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています・・・とか) やりたいことを実現するために自分ではどこまで実装できていて、どこで躓いていて、何が分かれば解決できるかを、自分が書いたコード(Python ではなくて C# の)を質問欄に貼るなどして説明してください。丸投げは歓迎されません。 読んでください。 https://teratail.com/help/avoid-asking https://teratail.com/help/question-tips
sadokazu

2023/05/11 01:15

大変失礼しました c#側からProcessでpythonコードを実行しています 環境は Windows10 VisualStudio 2022 Pro .NET6.0 Anaconda 3 Python3.9となります
退会済みユーザー

退会済みユーザー

2023/05/11 01:46

Python を .NET の C# で動かすとかは全然わからないので思い付きレベルの話ですが・・・ .NET Core / .NET では特定の OS に依存する機能は Visual Studio のテンプレートで作るプロジェクトには含まれてないです。その一つが Windows OS の GDI+ に依存する System.Drawing 名前空間のグラフィックス機能ですが、そのあたりは関係ありませんか? ちなみに、System.Drawing 名前空間のグラフィックス機能を利用するには NuGet パッケージ System.Drawing.Common をインストールする必要があります。 ハズレだったらすみません。
sadokazu

2023/05/11 01:59

回答ありがとうございます 現在も苦闘している状態ですが、 Python側にて スレッドプールで OpenCVで画像読み込み PILで画像読み込み ImageIOで画像読み込み これらを実行しましたが正常でした ただC# 側からの読み出しでは上記3つとも止まります system.Drawing.CommonはNugetで追加済みで、c#側ではBitmapクラスを使った、BitmapDataを使えることも確認しているのですが・・・・。
退会済みユーザー

退会済みユーザー

2023/05/11 02:09 編集

コメント欄に書かれた開発環境や、System.Drawing.Common は Nuget で追加済みなのどの追加情報は質問欄を編集して追記願います。ここコメント欄はもともと質問の追加情報を依頼する場所で、初期画面では閉じていて見ない人もいますので。
can110

2023/05/11 02:10

念のため確認ですが、C#からのPythonプロセス実行時 Image.openしている、同じ.bmpファイルをC#側でも開いていたりはしていないでしょうか?
sadokazu

2023/05/11 02:22

自己解決いたしました。 最小構成プログラムを作成して実験してところ、正常に動くことを確認しました。 コードは記載いたします いろいろとご検討いただきありがとうございました
guest

回答1

0

自己解決

自己解決
最小構成プログラムを作成して実行したところ、
c#側からスレッドプールで実施されている画像読み出しを行うことが出来ました
コードは質問欄に記載しました
お手数おかけして大変申し訳ありませんでした

実験コードでは上手くいったので、何が原因で問題が発生したのかを突き止めたいと思います
ご協力頂きありがとうございました

投稿2023/05/11 02:30

sadokazu

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問