C〓〓の呼び出しpython.exeはarcpy方式を使用します。
6857 ワード
背景
環境: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のプロセスは、基本的にここからです。テストコードを添付します。
二つの環境が明らかに見えます。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のためにスクリプトコードを処理します。
なぜこの位置を取得しますか?
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〓〓コードは以下の通りです
レジストリを開くときは、マシンの桁数を判断し、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方式を使って、みんなのすべての内容を共有しました。参考にしてください。皆さんも応援してください。
環境: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方式を使って、みんなのすべての内容を共有しました。参考にしてください。皆さんも応援してください。