実現したいこと
Unity上で、C#スクリプトを使ってpythonスクリプトを実行したい
その間に出るModuleNotFoundError:を無くしてimport できるようにしたい
各ファイルの配置は以下のようになています。
Unityでpython連携方法はこちらを参考にさせていただきました。
UnityとPythonを連携する【Python.NET】
(C#)PythonImages.csで(Python)generate_image.pyを呼び出して実装しようとしています。
E:\ └── MyData\ └── GPT_BOT\ └── Assets\ ├── StreamingAssets\ │ └── myproject\ │ ├── generate_image.py(これがmain.py) │ │ │ ├── models\ │ │ ├── big_resnet.py │ │ ├── XXX.py │ │ ├── XXX.py │ │ └── XXX.py │ ├── configs\ │ │ └── CIFAR10\ │ │ └── ReACGAN.yaml │ └── utils\ │ ├── misc.py │ └── ops.py │ └── Scenes └── PythonImages.cs
発生している問題・分からないこと
generate_image.py
1import torch 2from models.big_resnet import Generator 3import config as Cfg # アップロードされたconfig.pyから設定をインポート
上記 from models.big_resnet import Generator のmodelsでModuleNotFoundError:が出ており
インポートができなくなっています。
そこでChatGPTを利用したところ、Passを設定を行うとよいと聞き、C#スクリプトにパスの設定をしましたが、同様のエラーが出てしまいました。
有識者の方、ご教示いただけると幸いです。
エラーメッセージ
error
1Python script error: Traceback (most recent call last): 2 File "E:\MyData\GPT_BOT\Assets\StreamingAssets\myproject\generate_image.py", line 5, in <module> 3 from models.big_resnet import Generator 4ModuleNotFoundError: No module named 'models' 5
該当のソースコード
C#script
1using System.Collections; 2using System.Diagnostics; 3using System.IO; 4using UnityEngine; 5using UnityEngine.UI; 6 7public class PythonImageGenerator : MonoBehaviour 8{ 9 // Pythonの実行ファイルのパスとPythonスクリプトのパスを設定 10 public string pythonPath = @"Assets\StreamingAssets\python-3.10.11-embed-amd64\python.exe"; // Pythonの実行ファイルのパス 11 public string scriptPath = @"Assets\StreamingAssets\myproject\generate_image.py"; // Pythonスクリプトのパス 12 public Renderer quadRenderer; // 画像を表示するオブジェクトのレンダラー 13 public Button generateImageButton; // 画像生成ボタン 14 15 // ボタンのクリックイベントにコルーチンを登録 16 void Start() 17 { 18 generateImageButton.onClick.AddListener(() => 19 { 20 UnityEngine.Debug.Log("Button was clicked!"); 21 StartCoroutine(GenerateAndApplyImage()); 22 }); 23 } 24 25 // Pythonスクリプトを実行して画像を生成、適用するコルーチン 26 IEnumerator GenerateAndApplyImage() 27 { 28 // Pythonスクリプトの実行設定 29 ProcessStartInfo start = new ProcessStartInfo 30 { 31 FileName = pythonPath, 32 Arguments = $"\"{scriptPath}\"", // スクリプトパスをダブルクォートで囲む 33 UseShellExecute = false, 34 RedirectStandardOutput = true, 35 RedirectStandardError = true, 36 CreateNoWindow = true 37 }; 38 39 // PYTHONPATHやその他の環境変数を設定 40 string pythonHome = @"E:\MyData\GPT_BOT\Assets\StreamingAssets\python-3.10.11-embed-amd64"; 41 string projectPath = @"E:\MyData\GPT_BOT\Assets\StreamingAssets\myproject"; 42 start.EnvironmentVariables["PYTHONHOME"] = pythonHome; 43 start.EnvironmentVariables["PYTHONPATH"] = $"{projectPath};{projectPath}\\models;{projectPath}\\configs;{projectPath}\\utils"; 44 45 // プロセスの実行 46 Process process = Process.Start(start); 47 yield return new WaitUntil(() => process.HasExited); // プロセスが終了するまで待つ 48 49 string generatedFileName = null; 50 51 // エラー出力がある場合は表示 52 if (process.ExitCode != 0) 53 { 54 UnityEngine.Debug.LogError($"Python script error: {process.StandardError.ReadToEnd()}"); 55 } 56 else 57 { 58 UnityEngine.Debug.Log("Python script executed successfully."); 59 generatedFileName = process.StandardOutput.ReadLine(); // Pythonの標準出力から生成されたファイル名を取得 60 } 61 62 // 生成されたファイル名が正しければ画像をロード 63 if (!string.IsNullOrEmpty(generatedFileName)) 64 { 65 string imagePath = Path.Combine(Path.GetDirectoryName(scriptPath), generatedFileName); 66 67 // ファイルが存在すればロードしてオブジェクトに適用 68 if (File.Exists(imagePath)) 69 { 70 byte[] imageBytes = File.ReadAllBytes(imagePath); 71 Texture2D tex = new Texture2D(2, 2); 72 tex.LoadImage(imageBytes); 73 tex.Apply(); 74 75 // オブジェクトにテクスチャを適用 76 quadRenderer.material.mainTexture = tex; 77 } 78 else 79 { 80 UnityEngine.Debug.LogError("Image file not found."); 81 } 82 } 83 } 84} 85
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
以下のコードを追加したが、エラー改善はされなかった
// Pythonスクリプトの実行設定 ProcessStartInfo start = new ProcessStartInfo { FileName = pythonPath, Arguments = $"\"{scriptPath}\"", // スクリプトパスをダブルクォートで囲む UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true }; // PYTHONPATHやその他の環境変数を設定 string pythonHome = @"E:\MyData\GPT_BOT\Assets\StreamingAssets\python-3.10.11-embed-amd64"; string projectPath = @"E:\MyData\GPT_BOT\Assets\StreamingAssets\myproject"; start.EnvironmentVariables["PYTHONHOME"] = pythonHome; start.EnvironmentVariables["PYTHONPATH"] = $"{projectPath};{projectPath}\\models;{projectPath}\\configs;{projectPath}\\utils";
補足
特になし
回答1件
あなたの回答
tips
プレビュー