3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[UE5]c++でコマンドプロンプトを呼び出し、Pythonの実行

Last updated at Posted at 2023-01-20

はじめに

以前の記事でPythonを実行する方法を書きましたが、
この機能は実験的機能なので、ゲームをパッケージ化したら、うまく使用できません。
本記事でコマンドプロンプトを呼び出し、Pythonを実行する方法を紹介します。

Unreal Engineドキュメント:Python を使用したエディタのスクリプティング
https://docs.unrealengine.com/5.0/ja/scripting-the-unreal-editor-using-python/

この方法は、C++で関数(BlueprintFunctionLibrary)を書いて、ブループリントで関数ノードを使用する方法です。

準備

Unreal EngineとVisual Studioをインストールします。
セットアップは下記のURLを参考にしてください。

方法

Step 1 新規C++クラス BlueprintFunctionLibrary

UEでBlueprintFunctionLibraryクラスを新規します。
以前の記事で簡単な説明をしています。良ければ参考にしてください。

Step 2 コードの編集

.hファイルでRunMyPython関数を追加します。

MyBlueprintFunctionLibrary.h
UFUNCTION(BlueprintCallable, Category = "RunPython")
static bool RunMyPython(int32& ProcessId, 
FString FullPathOfProgramToRun, TArray<FString> CommandlineArgs, bool Hidden);

引数戻り値の意味は下の通りです。

引数
FullPathOfProgramToRun:python.exeへのパス (FString型)
CommandlineArgs:コマンドライン引数 (FString型の配列)
Hidden:コマンドプロンプトのウィンドウの表示/非表示 (bool型)
戻り値
ProcessId:実行中のプロセスid (int32型)
return:プロセスが完成すると、trueを戻る (bool型)

.cppファイルでRunMyPython関数の詳細コードを書きます。

MyBlueprintFunctionLibrary.cpp
bool UForExePython::RunMyPython(int32& ProcessId, FString FullPathOfProgramToRun, 
TArray<FString> CommandlineArgs, bool Hidden) 
{
    /*
    コマンドライン引数の配列を空白で結合する
    */
    FString Args = "";
	if (CommandlineArgs.Num() > 1)
	{
		Args = CommandlineArgs[0];
		for (int32 v = 1; v < CommandlineArgs.Num(); v++)
		{
			Args += " " + CommandlineArgs[v];
		}
	}
	else if (CommandlineArgs.Num() > 0)
	{
		Args = CommandlineArgs[0];
	}


    /*
    新しいプロセスを作成する(CreateProcess関数と似てるもの)
    */
	uint32 NeedBPUINT32 = 0;
	FProcHandle ProcHandle = FPlatformProcess::CreateProc(
		*FullPathOfProgramToRun,
		*Args,
		Hidden, //trueにしたら、コマンドプロンプトのウィンドウを非表示にする
		false,
		false,
		&NeedBPUINT32,
		0,
		nullptr,
		nullptr);

	ProcessId = NeedBPUINT32;

	if (ProcHandle.IsValid()) {
        /*
        上記のプロセスが終了したまで、待ちます。
        */
		while (FPlatformProcess::IsProcRunning(ProcHandle));
		FPlatformProcess::CloseProc(ProcHandle);
	}

	return true; //プロセスが終了して、trueを戻る。
}

使用方法

C++ファイルを修正し、UEのプロジェクトを更新して、ブループリントでRun My Pythonノードが使用できると思います。
qu1.png

  • 説明1
    上記の画像通りで、入力も同じ文字列で使用すると、
    普通のコマンドプロンプト(Windowsではcmd)で、"C:/xxx/xxx/python.exe" pyfile.py --input C:/xxx/xxx/myfile.txtというコマンドを実行すると同じ結果が出るはずです。

  • 説明2
    Hiddenにチェックを入れると、コマンドプロンプトのウィンドウを表示しません。

  • 説明3
    Pythonプロセスを終了して、Return Valueではtrueが出力します。
    とは言え、Pythonプロセスを待つことが可能になります。

感想

Windowsでアプリを開発すると、C/C++言語は汎用性が高いので、よく使われます。今回は、Unreal EngineでPythonを使用したいため、色々調べて実現できました。

最後まで読んでいただき、ありがとうございました。
皆さんの参考になれば幸いです。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?