C〓〓の呼び出しpython.exeはarcpy方式を使用します。


背景
環境:ArcGis 10.2.2。C↉開発プログラムは、Desktopのpython環境(32桁)を呼び出してデータ処理分析を行ってきました。しかし、データ量が大きいと、メモリ資源が足りない場合があります。したがって、64ビットのpython環境を使用することにした。
問題にぶつかる
C((zhi)はProcess.Start()を通じて64ビットのpython.exeを呼び出します。Debugモードでは問題ありませんが、直接運転してexeを実行してProcess finished with ext code-10737418(0 xC 00005)。指向異常
問題を分析する
後に発見されたのは、arcpyモジュールによるもので、このモジュールの内容を除いて実行できます。import arcpyは動作しません。arcpyを使ってデータ処理をするからには、import arcpyさえできないなら、おならをします。プログラムDebugモードとRunモードの違いを探し始めました。
プログラムの中でProcesStartInfoを使って起動するpython.exeのプロセスは、基本的にここからです。テストコードを添付します。

var start = new ProcessStartInfo
{
 WorkingDirectory = Environment.CurrentDirectory,
 FileName = sInterpreterPath,
 UseShellExecute = false,
 ErrorDialog = true,
 CreateNoWindow = true,
 RedirectStandardOutput = true,
 RedirectStandardInput = true,
 Arguments = sParam
};
using (Process process = Process.Start(start))
{
 var a = start.Environment;
 var b = a.Keys.ToList();
 b.Sort();
 var sss = "";
 foreach (var it in b)
 {
 sss = $"{sss}
{it}------->{a[it]}"; } sss = sss.Trim(); using (StreamReader reader = process.StandardOutput) { var sResult = ""; while (!reader.EndOfStream) { sResult = $"{sResult}
{reader.ReadLine()}"; } sResult = sResult.Trim(); MessageBox.Show(sResult); } MessageBox.Show("ExitCode is " + process.ExitCode); }
そこで、DebugモードのRunモードのプロセス環境変数と比較した。

二つの環境が明らかに見えます。COMPAT_LAYERの値は違います。調べてみましたCOMPAT_LAYERは32ビットのプログラムで64ビットのpython.exeを呼び出していますので、このパラメータによる問題があると思います。RunAdminは管理者で動作しますが、Installerはインストールツールと解釈します。
問題を解決する
上から分析してみたところ、__u u uかもしれません。COMPAT_LAYERの値が違っているから問題が発生します。それでは問題に対処できます。今はRun Adminの下の値もRunAdminに設定されています。次のコードを追加:
start.Evironment VentVarables["COMPAT_LAYER"="RunAdmin";
start.Environment["COMPAT_LAYER"="RunAdmin";
再運行が成功しました。
以下にC〓〓〓を添付して64を呼び出します。Pythoon.exeのためにスクリプトコードを処理します。

/// <summary>
///   Python  
/// </summary>
/// <param name="sScriptPath">    </param>
/// <param name="lstParam">    </param>
/// <returns>    </returns>
public bool RunScript(string sScriptPath, List<string> lstParam)
{
 var bResult = false;
 try
 {
 if (!File.Exists(sScriptPath))
 throw new Exception($"  {sScriptPath}   !");
 var sInterpreterPath = @"E:\ArcGIS\Python27\ArcGISx6410.2\python.exe";
 var sParam = $"{sScriptPath}";
 if (null != lstParam && 0 < lstParam.Count)
 {
 var sArgument = "\"" + string.Join("\" \"", lstParam) + "\"";
 sParam = $"\"{sParam}\" {sArgument}";
 }
 var start = new ProcessStartInfo
 {
 WorkingDirectory = Environment.CurrentDirectory,
 FileName = sInterpreterPath,
 UseShellExecute = false,
 ErrorDialog = true,
 CreateNoWindow = true,
 RedirectStandardOutput = true,
 RedirectStandardInput = true,
 Arguments = sParam
 };
 start.EnvironmentVariables["__COMPAT_LAYER"] = "RunAsAdmin";
 start.Environment["__COMPAT_LAYER"] = "RunAsAdmin";
 using (Process process = Process.Start(start))
 {
 using (StreamReader reader = process.StandardOutput)
 {
 var sResult = "";
 while (!reader.EndOfStream)
 {
  sResult = $"{sResult} 
{reader.ReadLine()}"; } sResult = sResult.Trim(); MessageBox.Show(sResult); } MessageBox.Show("ExitCode is " + process.ExitCode); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } return bResult; }
補足知識:C〓レジストリからArcPyのpython.exe設置位置を取得する。
なぜこの位置を取得しますか?
C〓でコマンドを呼び出してPythonスクリプトを実行するには、Pythonインタプリタは不可欠なツールです。ArcGIS 10.2.2インストール時にはPythonがデフォルトでインストールされていますが、ユーザーによってはPythonを異なる位置に設置することができます。
それなら、私達のシステムが他のユーザーに使う時、必ずPython解凍器すなわちpython.exeファイルの位置を見つけて、正常にツールコールを実行することができます。
もちろん、ファイルの位置を環境変数に書き込むことができます。これはフルパスを取得する必要がありません。本稿ではこのような状況は考えられない。
この位置はどうやって取得しますか?
複数のコンピュータを比較して、Pythonがインストールされた後、レジストリの中に位置します。LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curent Version\Installer\UserData\S-1-5-18\Componentsで自動的にキー「9 A 677 D 28 A 88 AEB 44 AD 0 AE 3 AA51002 C」を作成します。
キーの下に値があります。対応するデータはpython.exeのフルパスです。私たちはこのデータを読むだけで、python.exe位置を取得できます。

C〓〓コードは以下の通りです

  /// <summary>
  /// Python.exe            (  ArcGIS  Python       )
  /// </summary>
  private static readonly string RegistryPythonDefaultKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\";
  /// <summary>
  /// Python.exe          (  ArcGIS  Python       )
  /// </summary>
  private static readonly string RegistryPythonTargetKey = "9A6767D28A88AEB44AD0AE3AA51002C0";
  /// <summary>
  ///   Python.exe    
  /// </summary>
  /// <returns></returns>
  private static string GetPythonPath()
  {
   var sPythonPath = "";
   try
   {
    var registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
     Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32); //      
    var targetSubKey = registryKey.OpenSubKey(Path.Combine(RegistryPythonDefaultKey, RegistryPythonTargetKey));
    var lstName = targetSubKey.GetValueNames();
    foreach (var sName in lstName)
    {
     var sValue = targetSubKey.GetValue(sName) + string.Empty;
     if (!sValue.EndsWith("python.exe", StringComparison.OrdinalIgnoreCase) || !File.Exists(sValue))
     {
      continue;
     }
     sPythonPath = sValue;
     break;
    }
   }
   catch (Exception ex)
   {
    SysConfig.Model.LogServices.WriteExceptionLog(ex, "GetPythonPath");
   }
   return sPythonPath;
  }
注意すべき点は?
レジストリを開くときは、マシンの桁数を判断し、32桁と64桁のレジストリの位置が異なります。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curent Version\Installer\UserData\S-1-5-18\Components
HKEY_LOCAL_MACHINE\SOFTWARE\WOW 6432 Node\Microsoft\Windows\CurentVersion\Installer\UserData\S-1-5-18\Components
以上のC((zhi)はpython.exeを使って、arcpy方式を使って、みんなのすべての内容を共有しました。参考にしてください。皆さんも応援してください。