質問するログイン新規登録

Q&A

0回答

3698閲覧

C#からPythonを実行する方法【Unity】

Nao.skywalker

総合スコア0

C#

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

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Unity

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

Python

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

0グッド

1クリップ

投稿2020/05/20 09:04

編集2020/05/20 09:08

0

1

前提・実現したいこと

こちらのサイト(https://tofgame.hatenablog.com/entry/2019/04/30/011221)を参考に、Unity(C#)側からPythonの実行を行おうとしています。

サイト通りの、文字を出力するだけのtst.pyは実行できるのですが、OpenCV(cv2)などを用いた画像表示やカメラの起動など(画面が別表示されようなもの)ができません。
※エラーメッセージは出ず、スルーされている様子。

どのようにすればよいでしょうか?

該当のソースコード

C#

1CsPy.cs(Unity側、Pythonを実行する) 2 3using System.Diagnostics; 4using System.IO; 5using UnityEngine; 6 7public class CsPy : MonoBehaviour { 8 //pythonがある場所 9 private string pyExePath = @"(Pythonの実行ファイルが置いてある場所)\python.exe"; 10 11 //実行したいスクリプトがある場所 12 private string pyCodePath = @"(実行したいスクリプトの場所)\tst.py"; 13 14 private void Start () { 15 //外部プロセスの設定 16 ProcessStartInfo processStartInfo = new ProcessStartInfo() { 17 FileName = pyExePath, //実行するファイル(python) 18 UseShellExecute = false,//シェルを使うかどうか 19 CreateNoWindow = true, //ウィンドウを開くかどうか 20 RedirectStandardOutput = true, //テキスト出力をStandardOutputストリームに書き込むかどうか 21 Arguments = pyCodePath + " " + "Hello,python.", //実行するスクリプト 引数(複数可) 22 }; 23 24 //外部プロセスの開始 25 Process process = Process.Start(processStartInfo); 26 27 //ストリームから出力を得る 28 StreamReader streamReader = process.StandardOutput; 29 string str = streamReader.ReadLine(); 30 31 //外部プロセスの終了 32 process.WaitForExit(); 33 process.Close(); 34 35 //実行 36 print(str); 37 } 38} 39

Python

1tst.py(Unity側から実行される・成功しているもの) 2 3import sys #引数を得るために使用 4playerSelect=str(sys.argv[1]) 5print( "REPLY[" + playerSelect + "]:" + "Hello,CS." )

Python

1失敗例(Anaconda Promptでは動作している) 2 3import cv2 4 5img = cv2.imread("〇〇〇.jpg") 6img = cv2.rectangle(img,(10,20),(150,60),(255,255,0),3) 7img = cv2.circle(img, (100, 200), 1, (0, 0, 255), 2) 8img = cv2.putText(img,'OpenCV',(0,50), cv2.FONT_HERSHEY_SIMPLEX, 0.5,(255,255,255),2,cv2.LINE_AA) 9 10cv2.imshow("color",img) 11cv2.waitKey(0) 12cv2.destroyAllWindows()

試したこと・エラーメッセージ

UseShellExecute = false,//シェルを使うかどうか
という部分をtrueに変えればできのではないかと思い、trueに変更すると以下のエラーメッセージがでます。

※tst.py(成功例)の場合でも、trueに変更するとエラー

エラーメッセージ InvalidOperationException: The Process object must have the UseShellExecute property set to false in order to redirect IO streams. System.Diagnostics.Process.StartWithShellExecuteEx (System.Diagnostics.ProcessStartInfo startInfo) (at <ae22a4e8f83c41d69684ae7f557133d9>:0) System.Diagnostics.Process.Start () (at <ae22a4e8f83c41d69684ae7f557133d9>:0) (wrapper remoting-invoke-with-check) System.Diagnostics.Process.Start() System.Diagnostics.Process.Start (System.Diagnostics.ProcessStartInfo startInfo) (at <ae22a4e8f83c41d69684ae7f557133d9>:0) CsPy.Start () (at Assets/CsPy.cs:26)

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

Python3.0
Unity 2019.3.13f1
Visual Studio 2015

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問