75861


VisualStudio2019、c#、UWPで、Pythonスクリプトを呼び出して実行したいのですが、  
Web上で公開されているコードで試した結果、例外(アクセスが拒否されました。)が発生する。

参考にしたwebサイトは、<https://www.gis-py.com/entry/csharp-py> です。

[code]

    var pythonInterpreterPath = @"C:\Users\xxx\AppData\Local\Programs\Python\Python37\python.exe";
    var pythonScriptPath = @"D:\BW\tes01.py";
    var arguments = new List<string>
    {
        pythonScriptPath,
        "arg1",
        "arg2"
    };
    
    var process = new Process()
    {
        StartInfo = new ProcessStartInfo(pythonInterpreterPath)
        {
            UseShellExecute = false,
            RedirectStandardOutput = true,
            Arguments = string.Join(" ", arguments),
            },
        };
    
        process.Start();
    
[/code]

例外の詳細：

[code]

    System.ComponentModel.Win32Exception
      HResult=0x80004005
      Message=アクセスが拒否されました。
      Source=System.Diagnostics.Process
      スタック トレース:
       at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
    
[/code]


CC BY-SA 4.0
2020-03-04T02:43:41.470
63548
2021-05-16T01:10:34.027
2020-03-04T08:56:35.143
32986
question
python c# visual-studio uwp
C#(UWP)からPythonスクリプトが実行できない


コメントで紹介した記事と、さらにその前段記事の組み合わせで動作させられるようです。  
確認したわけでは無いのと2年前の記事なので変わっているかもしれないので、これらを参考に試してみてください。  
ポイントになりそうなところを抜粋しておきます。詳細は記事を参照してください。

[Desktop Bridge のアプリで UWP から同じパッケージ内の exe
を起動する方法](https://blog.okazuki.jp/entry/2018/02/09/204909)

> **プロジェクトの設定**  
>  LaunchApp プロジェクトのアプリケーションの右クリックメニューから参照の追加で、LaunchApp.UWP と LaunchApp.WPF
> を追加します。
>
> **マニフェストへの exe の登録**  
>  LaunchApp プロジェクトの Package.appxmanifest を右クリックしてコードの表示をします。  
>  Package タグに以下の xml 名前空間を追加します。
>
> そして、Application タグの下に Extensions タグを以下のように追加します。  
>  ここに登録した exe が起動できます。注意点は1つしか登録できないところですかね。（多分）
>
> **UWP から exe の起動**  
>  まず、FullTrustProcessLauncher クラスを使うのですが、これはデスクトップデバイスファミリーのみで使えるので参照に追加します。  
>  参照の追加で Universal Windows → 拡張 の中にある Windows Desktop Extensions for the UWP
> にチェックを入れます。
>
> exe を起動するきっかけのボタンを MainPage.xaml に置きます。
>
> MainPage.xaml.cs で以下のコードを書きます。
>
> FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync() で先ほど定義した
> Extension の exe が起動します。

[DesktopBridge アプリで UWP アプリと Win32
アプリの連携方法](https://blog.okazuki.jp/entry/2018/02/10/174735)

> 起動は出来たら次したいことは連携ですよね。ということでしてみましょう。  
>  **仕組み**  
>  UWP の AppService を使ってやるのがお勧めです。  
>  [アプリ サービスと拡張機能の使用](https://docs.microsoft.com/ja-jp/windows/uwp/launch-
> resume/app-services)  
>  UWP 側で AppService を作っておいて、それを介して WPF などの Win32 アプリと UWP のアプリが連携するようにします。
> なのでこんな感じで動くような雰囲気ですね。
>
>   * UWP アプリ起動
>   * Win32 アプリ起動
>   * Win32 アプリから AppService へ接続
>     * UWP アプリ側で AppService が起動する
>   * 接続を介してやり取り
>

>
> 私が最後に UWP を勉強したときは別プロセスで AppService が起動してたような気がするのですが最近は UWP
> アプリと同じプロセスで可能になっててびっくりしました。  
>  [ホスト アプリと同じプロセスで実行するようにアプリ サービスを変換する](https://docs.microsoft.com/ja-
> jp/windows/uwp/launch-resume/convert-app-service-in-process)  
>  **App.xaml.cs の編集**
>
> **WPF 側の実装**  
>  あとは MainWindow でクリックされたときに AppServiceConnection を作って繋ぎに行ってます。
>
> **コード**  
>  プロジェクトは GitHub に公開しています。GitHub のほうのコードは、ここでのコードをちょっと改造して UWP -> WPF
> 方向の通信も追加しています。  
>
> [runceel/DesktopBridgeAppService](https://github.com/runceel/DesktopBridgeAppService)

* * *

ちなみに、起動する exe が
UWPアプリのAppXフォルダ(UWPアプリと同じフォルダということ？)に入っている必要があるようなので、PyInstallerとかで exe
化した方が良いかもしれません。  
[UWP LaunchFullTrustProcessForCurrentAppAsync - EXE file not
found](https://stackoverflow.com/q/54686706/9014308)

> As Mentioned in the official sample the exe file has to in the Appx folder
> of your project
>

>> Make sure the RebootPC.exe was copied to the Appx folder -
UWP\bin\x64\Release\AppX if not rebuild the solution or copy it manually.

>
> 公式サンプルで言及したように、exeファイルはプロジェクトのAppxフォルダーにある必要があります
>

>> RebootPC.exeがAppxフォルダー（UWP \ bin \ x64 \ Release \
AppX）にコピーされていることを確認します（ソリューションを再構築しない場合、または手動でコピーする場合）。

[DesktopBridgeToUWP-
Samples/Samples/AppServiceBridgeSample/](https://github.com/Microsoft/DesktopBridgeToUWP-
Samples/tree/master/Samples/AppServiceBridgeSample#builddeploy-and-run-the-
sample)

他参考に。  
[UWP：FullTrustProcessLauncher
で起動したプログラムに引数を渡す](https://blog.daruyanagi.jp/entry/2018/06/09/163500)


CC BY-SA 4.0
2020-03-04T05:16:10.113
63553
2020-03-04T05:27:22.417
2020-03-04T05:27:22.417
26370
26370
63548
answer


すでに他の方の回答にある通りですが、以下の2つの制約から提示されているコードを実行するのは難しいように思います。

  1. UWPのコードから直接Process.Startメソッドを使うことはできない
  2. アプリパッケージ外の実行ファイルの起動は許可されていない

1の制約を回避するためには、まずFullTrustProcessLauncherで.NETアプリを起動させて、そこからProcess.Startを使う必要があります。  
2の制約を回避するためには、PythonスクリプトをPyInstallerなどでexeファイル化しておく必要があります。

この辺の詳しい手順や注意事項、実際にMicrosoft Storeに提出したリファレンスアプリなどを記事にまとめましたので、もしよければご覧ください。  
[UWPアプリにPythonでコーディングした処理を組み込む](https://biotech-lab.org/articles/9985)


CC BY-SA 4.0
2021-05-16T01:10:34.027
75861
2021-05-16T01:10:34.027
45321
63548
answer