为何要获取该位置?
在C#中调用命令执行Python脚本的时候,Python解释器是必不可少的工具。ArcGIS 10.2.2安装时默认安装Python,但不同用户可能将Python安装到不同位置,比如,本人就将其安装到D盘而非默认的C盘。那么,当我们的系统给其他用户使用时,势必需要找到Python解释器即python.exe文件位置,才能正常执行工具调用。
当然,你可以将文件位置写入到环境变量,这位就无需获取全路径了。本文不考虑此种情形。
如何获取该位置?
对比多台电脑发现,Python安装后,会在注册表中位置“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components”下自动创建一个键“9A6767D28A88AEB44AD0AE3AA51002C0”。该键下有一个值,对应的数据即为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\CurrentVersion\Installer\UserData\S-1-5-18\Components
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components