発生状況
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
回答1件
あなたの回答
tips
プレビュー