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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Python

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

Q&A

解決済

1回答

303閲覧

UnityでPythonを実行するとModuleNotFoundError: 助けてください

Tyutohannpa_

総合スコア25

C#

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Python

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

0グッド

0クリップ

投稿2024/09/12 03:56

編集2024/09/12 04:14

実現したいこと

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";

補足

特になし

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

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

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

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

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

melian

2024/09/12 07:38

> // Pythonの実行ファイルのパスとPythonスクリプトのパスを設定 > public string pythonPath = @"Assets\StreamingAssets\python-3.10.11-embed-amd64\python.exe"; // Pythonの実行ファイルのパス Assets\...\python-3.10.11-embed-amd64\python.exe となっていますので、Embeddable Python を使われているのだろうと思いますが、以下の issue の報告によれば Embeddable Python は環境変数を参照しないそうです。なので、環境変数 PYTHONPATH に models フォルダを追加しても参照されず、結果としてインポートに失敗しているのではないかと思います。 Embeddable Python does not use PYTHONPATH. · Issue #72432 · python/cpython https://github.com/python/cpython/issues/72432 > See https://docs.python.org/3/using/windows.html#embedded-distribution > > When extracted, the embedded distribution is (almost) fully isolated from the user’s system, including environment variables, system registry settings, and installed packages.
guest

回答1

0

自己解決

以下のように修正したらできました。

csharp

1 // PYTHONPATHやその他の環境変数を設定 2 string projectPath = @"E:\MyData\GPT_BOT\Assets\StreamingAssets\myproject"; 3 start.EnvironmentVariables["PYTHONPATH"] = projectPath;

Python

1# モジュール検索パスに "myproject" ディレクトリを追加 2project_path = os.path.dirname(os.path.abspath(__file__)) # "myproject" のパスを取得 3sys.path.append(project_path) 4sys.path.append(os.path.join(project_path, 'models')) # "models" ディレクトリのパスを追加

まあ、また別のエラーが出たのですが、解決したので示させていただきます。
助言をしていただいた方ありがとうございました。

投稿2024/09/12 07:52

Tyutohannpa_

総合スコア25

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問