最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#調(diào)用python.exe使用arcpy方式

 更新時間:2020年12月09日 09:09:34   作者:秋漓  
這篇文章主要介紹了C#調(diào)用python.exe使用arcpy方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

背景

環(huán)境:ArcGis10.2.2。C#開發(fā)程序一直以來以調(diào)用Desktop的python環(huán)境(32位)來做數(shù)據(jù)處理分析。但是數(shù)據(jù)量大時,出現(xiàn)了內(nèi)存資源不夠的情況。因此決定換成使用64位python環(huán)境。

遇到問題

C#通過Process.Start()去調(diào)用64位python.exe,在Debug模式下毫無問題,但是直接運行exe就報錯Process finished with exit code -1073741819 (0xC0000005)。指向異常。

分析問題

后來發(fā)現(xiàn)是由于arcpy模塊導(dǎo)致的,去掉這個模塊的內(nèi)容就能運行,import arcpy就運行不起來。既然使用arcpy做數(shù)據(jù)處理,如果連import arcpy都不行,那還做個屁啊。于是開始尋找程序Debug模式下和Run模式下的區(qū)別。

程序中使用ProcessStartInfo類啟動的python.exe的進(jìn)程,那問題基本就出自這里了。附上檢測代碼:

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}\n{it}------->{a[it]}";
 }
 sss = sss.Trim();
 using (StreamReader reader = process.StandardOutput)
 {
 var sResult = "";
 while (!reader.EndOfStream)
 {
 sResult = $"{sResult} \n {reader.ReadLine()}";
 }
 sResult = sResult.Trim();
 MessageBox.Show(sResult);
 }
 MessageBox.Show("ExitCode is " + process.ExitCode);
}

于是就對比了Debug模式下與Run模式下的進(jìn)程環(huán)境變量。

明顯可見兩個環(huán)境的__COMPAT_LAYER值就是不一樣的。查了一下__COMPAT_LAYER是版本兼容相關(guān)參數(shù),由于我是32位程序調(diào)用64位python.exe,因此懷疑是這個參數(shù)導(dǎo)致的問題。RunAsAdmin是以管理員運行,而Installer的解釋是安裝工具。

解決問題

上面分析出可能是__COMPAT_LAYER值不同才導(dǎo)致的問題,那么就能對癥下藥了,現(xiàn)在把Run下的值也設(shè)置為RunAsAdmin。加上下例代碼:

start.EnvironmentVariables["__COMPAT_LAYER"] = "RunAsAdmin";

start.Environment["__COMPAT_LAYER"] = "RunAsAdmin";

再次運行,居然成功了。

下面附上C#調(diào)用64為Python.exe處理腳本代碼:

/// <summary>
/// 執(zhí)行Python腳本
/// </summary>
/// <param name="sScriptPath">腳本路徑</param>
/// <param name="lstParam">參數(shù)列表</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} \n {reader.ReadLine()}";
 }
 sResult = sResult.Trim();
 MessageBox.Show(sResult);
 }
 MessageBox.Show("ExitCode is " + process.ExitCode);
 }
 }
 catch (Exception ex)
 {
 MessageBox.Show(ex.ToString());
 }
 return bResult;
}

補(bǔ)充知識:C#從注冊表中獲取ArcPy的python.exe安裝位置

為何要獲取該位置?

在C#中調(diào)用命令執(zhí)行Python腳本的時候,Python解釋器是必不可少的工具。ArcGIS 10.2.2安裝時默認(rèn)安裝Python,但不同用戶可能將Python安裝到不同位置,比如,本人就將其安裝到D盤而非默認(rèn)的C盤。

那么,當(dāng)我們的系統(tǒng)給其他用戶使用時,勢必需要找到Python解釋器即python.exe文件位置,才能正常執(zhí)行工具調(diào)用。

當(dāng)然,你可以將文件位置寫入到環(huán)境變量,這位就無需獲取全路徑了。本文不考慮此種情形。

如何獲取該位置?

對比多臺電腦發(fā)現(xiàn),Python安裝后,會在注冊表中位置“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components”下自動創(chuàng)建一個鍵“9A6767D28A88AEB44AD0AE3AA51002C0”。

該鍵下有一個值,對應(yīng)的數(shù)據(jù)即為python.exe的完整路徑。我們只需要讀到這個數(shù)據(jù),即可獲取python.exe位置。

C#代碼如下:

  /// <summary>
  /// Python.exe路徑在注冊表中的安裝位置(安裝ArcGIS自帶Python環(huán)境時自動創(chuàng)建)
  /// </summary>
  private static readonly string RegistryPythonDefaultKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\";
  /// <summary>
  /// Python.exe路徑在注冊表中的鍵名(安裝ArcGIS自帶Python環(huán)境時自動創(chuàng)建)
  /// </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); //判斷機(jī)器位數(shù)
    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;
  }

需要注意的地方?

打開注冊表的時候,需要判斷機(jī)器位數(shù),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

以上這篇C#調(diào)用python.exe使用arcpy方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Dynamic和Var的區(qū)別及dynamic使用詳解

    Dynamic和Var的區(qū)別及dynamic使用詳解

    C#中的很多關(guān)鍵詞用法比較容易混淆,var和dynamic就是其中一組,他們都可以申明動態(tài)類型的變量,但是本質(zhì)上他們還是有不少區(qū)別的,下面通過本文給大家介紹Dynamic和Var的區(qū)別及如何正確使用dynamic,需要的朋友參考下
    2016-01-01
  • C#軟件注冊碼的實現(xiàn)代碼

    C#軟件注冊碼的實現(xiàn)代碼

    開發(fā)軟件時,當(dāng)用到商業(yè)用途時,注冊碼與激活碼就顯得很重要了,現(xiàn)在的軟件技術(shù)實在在強(qiáng)了,各種國內(nèi)外大型軟件都有注冊機(jī)制,但我們學(xué)習(xí)的是技術(shù)
    2013-05-05
  • Unity實現(xiàn)見縫插針小游戲

    Unity實現(xiàn)見縫插針小游戲

    這篇文章主要為大家詳細(xì)介紹了Unity實現(xiàn)見縫插針小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#中async和await的深入分析

    C#中async和await的深入分析

    Async/Await是C# 5引入的關(guān)鍵字,用以提高用戶界面響應(yīng)能力和對Web資源的訪問能力,同時它使異步代碼的編寫變得更加容易,下面這篇文章主要給大家介紹了關(guān)于C#中async和await的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C#約瑟夫問題解決方法

    C#約瑟夫問題解決方法

    這篇文章主要介紹了C#約瑟夫問題解決方法,較為詳細(xì)的分析了約瑟夫問題及C#解決技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#中的char、string和StringBuilder的使用詳解

    C#中的char、string和StringBuilder的使用詳解

    這篇文章主要介紹了C#中的char、string和StringBuilder的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • c# 所有類型都從Object類型派生

    c# 所有類型都從Object類型派生

    所有的類型最終從object派生,每一個類型都有一組最基本的方法
    2012-10-10
  • C# zxing二維碼寫入的實例代碼

    C# zxing二維碼寫入的實例代碼

    C# zxing二維碼寫入的實例代碼,需要的朋友可以參考一下
    2013-03-03
  • 淺談C#多線程下的調(diào)優(yōu)

    淺談C#多線程下的調(diào)優(yōu)

    本文主要介紹了C#多線程下的調(diào)優(yōu),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • c#中SqlTransaction——事務(wù)詳解

    c#中SqlTransaction——事務(wù)詳解

    這篇文章主要介紹了c#中SqlTransaction——事務(wù)詳解 ,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12

最新評論

巫溪县| 阿勒泰市| 正蓝旗| 工布江达县| 阿瓦提县| 延川县| 定州市| 怀集县| 鲁甸县| 柯坪县| 腾冲县| 承德市| 班玛县| 无极县| 正蓝旗| 金湖县| 义马市| 安溪县| 永嘉县| 依兰县| 崇明县| 武鸣县| 汉中市| 永福县| 随州市| 尉犁县| 罗山县| 会东县| 友谊县| 逊克县| 始兴县| 大同市| 宜宾县| 新宁县| 宝应县| 平果县| 高邑县| 县级市| 合阳县| 高州市| 九龙坡区|