C#从注册表中获取ArcPy的python.exe安装位置

为何要获取该位置?

在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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值