Як я можу програмно отримати шлях "Python.exe", який використовується ArcMap


16

Я працюю з надбудовою ArcMap в C #. З коду C # я виконав деякі сценарії Python. Тепер, щоб запустити цей сценарій, у мене є жорстко закодований шлях python. Але це не портативно. Отже, я хочу отримати шлях виконуваного Python з коду та використовувати його.

Питання:

Як я можу отримати шлях до виконуваного файлу Python, який використовується ArcMap з коду C #?

Редагувати:

З ваших пропозицій, я зараз використовую "середовище шляху", щоб отримати шлях Python.

//get python path from environtment variable
string GetPythonPath()
{
    IDictionary environmentVariables = Environment.GetEnvironmentVariables();
    string pathVariable = environmentVariables["Path"] as string;
    if (pathVariable != null)
    {
        string[] allPaths = pathVariable.Split(';');
        foreach (var path in allPaths)
        {
            string pythonPathFromEnv = path + "\\python.exe";
            if (File.Exists(pythonPathFromEnv))
                return pythonPathFromEnv;
        }
    }
}

Але є проблема:

Коли на моїй машині встановлена ​​інша версія python, немає гарантії, що "python.exe", яку я використовую, ArcGIS також використовує це.

Я не вдячний використовувати інший інструмент, щоб отримати шлях "python.exe" . Отже, я дійсно думаю, чи є спосіб отримати шлях від ключа реєстру. Для реєстру "ArcGIS10.0" виглядає так: введіть тут опис зображення

І для цього я думаю про наступний спосіб отримати шлях:

//get python path from registry key
string GetPythonPath()
{
    const string regKey = "Python";
    string pythonPath = null;
    try
    {
        RegistryKey registryKey = Registry.LocalMachine;
        RegistryKey subKey = registryKey.OpenSubKey("SOFTWARE");
        if (subKey == null)
            return null;

        RegistryKey esriKey = subKey.OpenSubKey("ESRI");
        if (esriKey == null)
            return null;

        string[] subkeyNames = esriKey.GetSubKeyNames();//get all keys under "ESRI" key
        int index = -1;
     /*"Python" key contains arcgis version no in its name. So, the key name may be 
     varied version to version. For ArcGIS10.0, key name is: "Python10.0". So, from
     here I can get ArcGIS version also*/
        for (int i = 0; i < subkeyNames.Length; i++)
        {
            if (subkeyNames[i].Contains("Python"))
            {
                index = i;
                break;
            }
        }
        if(index < 0)
            return null;
        RegistryKey pythonKey = esriKey.OpenSubKey(subkeyNames[index]);

        string arcgisVersion = subkeyNames[index].Remove(0, 6); //remove "python" and get the version
        var pythonValue = pythonKey.GetValue("Python") as string;
        if (pythonValue != "True")//I guessed the true value for python says python is installed with ArcGIS.
            return;

        var pythonDirectory = pythonKey.GetValue("PythonDir") as string;
        if (pythonDirectory != null && Directory.Exists(pythonDirectory))
        {
            string pythonPathFromReg = pythonDirectory + "ArcGIS" + arcgisVersion + "\\python.exe";
            if (File.Exists(pythonPathFromReg))
                pythonPath = pythonPathFromReg;
        }  
    }
    catch (Exception e)
    {
        MessageBox.Show(e + "\r\nReading registry " + regKey.ToUpper());
        pythonPath = null;
    }
    return pythonPath ;
}

Але перш ніж використовувати другу процедуру, я повинен бути впевнений у своїх здогадах. Здогадки:

  1. "True", пов'язаний з python, означає, що python встановлюється з ArcGIS
  2. Ключ реєстру ArcGIS 10.0 і версії верхньої версії будуть записані в одному процесі.

Будь ласка, допоможіть мені отримати будь-які роз’яснення щодо моїх здогадок.


5
Чи розглядали ви як створити інструмент для скриптів та виконати його з ArcObjects ?
blah238

3
Чи можете ви не просто встановити змінну середовища PATH для ArcGIS Python exe вимогою до встановлення для вашої надбудови?
Чад Купер

Все сказане, думка @ ChadCooper має бути найкращим способом. Замість того, щоб намагатися працювати назад, просто встановіть його раз і назавжди під час встановлення.
elrobis

@elrobis: Я знаю, встановити шлях у середовищі PATH - це хороший шлях. Але я хотів знати, чи є якийсь спосіб знайти пітона і зробити все, не перебиваючи користувача.
Емі

@ blah238 дякую за вашу пропозицію. Я ніколи не працював із інструментом сценарію. Можливо, мені потрібно дізнатися про це
Емі

Відповіді:


2

Я взяв ваш другий приклад коду, змусив його працювати як на 64, так і на 32-бітній ОС і трохи спростив його. Для мене працює в 10.1 на 64-розрядному Windows 7, але очевидно, ви повинні протестувати його на якомога більшій кількості середовищ і додавати назад у будь-які перевірки оборонного програмування, які ви вважаєте необхідними.

Після тестування чистої установки ArcGIS Desktop 10.1 без Python я виявив, що він не включає підрозділ Python10.x, не кажучи вже про значення "Python" True / False (все ще не впевнений, для чого це, можливо, зв’яжіться зі службою підтримки ESRI, якщо потрібно знати).

string GetPythonPath()
{
    string pythonPath = null;
    var localmachineKey = Registry.LocalMachine;
    // Check whether we are on a 64-bit OS by checking for the Wow6432Node key (32-bit version of the Software registry key)
    var softwareKey = localmachineKey.OpenSubKey(@"SOFTWARE\Wow6432Node"); // This is the correct key for 64-bit OS's
    if (softwareKey == null) {
        softwareKey = localmachineKey.OpenSubKey("SOFTWARE"); // This is the correct key for 32-bit OS's
    }
    var esriKey = softwareKey.OpenSubKey("ESRI");
    var realVersion = (string)esriKey.OpenSubKey("ArcGIS").GetValue("RealVersion"); // Get the "real", canonical version of ArcGIS
    var shortVersion = String.Join(".", realVersion.Split('.').Take(2).ToArray()); // Get just the Major.Minor part of the version number, e.g. 10.1
    var pythonKey = esriKey.OpenSubKey("Python" + shortVersion); // Open the Python10.x sub-key
    if (pythonKey == null) {
        throw new InvalidOperationException("Python not installed with ArcGIS!");
    }
    var pythonDirectory = (string)pythonKey.GetValue("PythonDir");
    if (Directory.Exists(pythonDirectory))
    {
        // Build path to python.exe
        string pythonPathFromReg = Path.Combine(Path.Combine(pythonDirectory, "ArcGIS" + shortVersion), "python.exe");
        if (File.Exists(pythonPathFromReg)) {
            pythonPath = pythonPathFromReg;
        }
    }
    return pythonPath;
}

На робочому столі 10.1 з Python це повертається C:\Python27\ArcGIS10.1\python.exe. На комп'ютері Desktop 10.1 без Python це викликає InvalidOperationException через відсутність ключа Python10.x.

Сподіваємось, це допоможе вам у тому, що ви намагаєтесь реально досягти, що - дивно - все ще мені не зрозуміло.


7

Замість того, щоб шукати виконуваний файл Python, ця тема довідки пропонує обстріл cmd.exeта запуск, python.exeне визначаючи його місцезнаходження. Зауважте, що це має спрацювати, оскільки інсталятор ArcGIS Desktop налаштований (редагувати: нещодавно протестований у 10.1, це не так) покладається на шлях python.exeдодавання до користувачаPATH змінної середовища користувача.

Інший підхід - створити інструмент сценарію та виконати його з ArcObjects .

Якщо ви дійсно шукаєте шлях до версії ArcGIS python.exe, за допомогою розширення підходу до інструменту скрипту ArcObjects + ви можете створити інструмент сценарію Python, єдиним результатом якого є значення sys.exec_prefix. Це шлях до папки, що містить версію Pychon ArcGIS, наприклад C:\Python27\ArcGIS10.1.

Бічна примітка : sys.executableповертає шлях до ArcMap.exeта НЕ python.exeпід час запуску в процесі, тому я не пропоную використовувати цю змінну.

Викличте інструмент сценарію від ArcObjects і отримайте вихід з поверненого IGeoProcessorResultоб'єкта.

Оновлення: Ось приклад проекту надбудови ArcMap (VS2010, .NET 3.5), який використовує інструмент сценарію, упакований у надбудову, який просто відображає шлях до python.exeвикористовуваного ArcMap: http://wfurl.com/cbd5091

Це просто кнопка, яку ви натискаєте, і вона спливає до скриньки повідомлень зі шляху:

Кнопка MessageBox

Цікаві біти коду:

  • Сценарій Python:

    import sys
    import os
    import arcpy
    
    def getPythonPath():
        pydir = sys.exec_prefix
        pyexe = os.path.join(pydir, "python.exe")
        if os.path.exists(pyexe):
            return pyexe
        else:
            raise RuntimeError("No python.exe found in {0}".format(pydir))
    
    if __name__ == "__main__":
        pyexe = getPythonPath()
        arcpy.AddMessage("Python Path: {0}".format(pyexe))
        arcpy.SetParameterAsText(0, pyexe)
  • C # функція:

    public string GetPythonPath()
    {
        // Build the path to the PythonPathToolbox
        string toolboxPath = Path.Combine(Path.GetDirectoryName(this.GetType().Assembly.Location), "PythonPath.tbx");
    
        // Initialize the geoprocessor.
        IGeoProcessor2 gp = new ESRI.ArcGIS.Geoprocessing.GeoProcessorClass();
    
        // Add the PythonPath toolbox.
        gp.AddToolbox(toolboxPath);
    
        // Need an empty array even though we have no input parameters
        IVariantArray parameters = new VarArrayClass();
    
        // Execute the model tool by name.
        var result = gp.Execute("GetPythonPath", parameters, null);
        return result.GetOutput(0).GetAsText();
    }

2
Але цей документ не говорить про це, інсталятор ArcGIS Desktop встановлює шлях до python.exe до змінної середовища PATH користувача. Таким чином, можливо, що шлях python не знаходиться в змінній середовища PATH. Тоді це створить помилку. Отже, як я можу бути впевнений, що виконуваний шлях python є змінною середовища PATH користувача.
Емі

2
Ви не можете, як і більшість речей у житті та обчислюючи все, що ви можете зробити, це робити припущення та сподіватися, що все спрацює, і скласти резервний план, коли вони цього не роблять (надайте інструкції щодо додавання його до змінної середовища PATH). Це означає, що якщо це звичайна установка, я вважаю, що інсталятор ArcGIS Desktop додає цей шлях до змінної середовища PATH.
blah238

2
Я бачив багато установок, де встановлений арггізом пітон не був на шляху. А що робити, якщо встановлено дві версії, а "неправильна" - на шляху?
blindjesse

У третьому абзаці я запропонував рішення, яке повинно знайти встановлення Pychon ArcGIS незалежно від PATHзмінної середовища.
blah238

@ blah238 не створює інструмент скрипту, щоб зробити мою надбудову менш портативною чи ускладнити процес установки надбудови на іншій машині?
Емі

6

Чи будете мати доступ до реєстру?

При встановленні ArcMap він встановить Python, якщо він не може його знайти. У реєстрі дивиться, щоб перевірити, чи вже встановлено Python. Я вважаю, що типовим місцем розташування реєстру є: комп'ютер \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath За допомогою типового ключа місця розташування Path (2.7 - 10.1, 2.6 - 10.0)

Я не можу придумати причину, коли / чому значення цього ключа було б невірним, але ви завжди можете піти таким чином: Всередині вулика Esri \ Desktop реєстру - це місце Python. Це простий шлях, який ви можете отримати, а потім створити подальші шляхи, щоб забезпечити наявність Python.exe. Наприклад, ключ на 64-бітній машині встановлюється на: комп'ютер \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 За допомогою клавіші PythonDir та пов'язаного зі значенням Path

Але мені подобається @ blah238 відповідь. Просто відкрийте підказку програми та запустіть її. Я не бачу причини, чому це не буде працювати.


2
Цей підхід також є недосконалим, оскільки може бути декілька установок Python, і ви не маєте прямого способу програмного визначення того, який з них використовується ArcGIS. Якщо у вас не працює архпія, це може не мати значення. І все-таки я думаю, що найбільш надійне рішення передбачало б реєстр і трохи логіки. Я не збираюся йти туди, хоча.
blah238

Що ж, логіка повинна починатися з новітньої версії 2.7 і працювати назад. Це, звичайно, може не вдатися, якщо ви встановили нову версію Python, потім перейшли та встановили старішу версію ArcGIS, яка встановила б старішу версію Python. Так, я погоджуюсь, що цей потенціал є, але це мало ймовірно (або ви можете просто побудувати пошук arc10.1 = py2.7, arc10.0 = py26 ... тощо, щоб бути на 100% впевненим). Як я вже сказав, найкращим методом, мабуть, був би просто обшивка командного рядка.
Хібма

@KHibma Я шукав через реєстр. Але я думаю, що це дійсно нудно, якщо я перегляну клавішу "PYTHON". У моїй машині встановлена ​​дві версії python, і вона повертає обидві. Я думаю, що це гарна ідея переглянути ключ "ESRI", і якщо є підрозділ "Python" з справжнім значенням, то я можу взяти значення підрозділу "PythonDir". Це працює в моєму випадку :)
Емі

Це неправильний спосіб пошуку шляху python у реєстрі за допомогою ключа "ESRI"? Або є ймовірність, що спосіб використання esri для створення ключів та значень у реєстрі може бути змінений, а код, можливо, не може прочитати його
Емі

Коли я кажу «пошук» реєстру, я маю на увазі використовувати фактичні шляхи, які я вказав вище. Якщо хтось не знає краще, розташування цих ключів реєстру (в реєстрі) не буде змінюватися від машини до машини. Тож ви просто задекоруєте шляхи, щоб побачити, чи є там ключі, якщо так, яке значення ...
KHibma

5

[Редагувати] Під час виконання setпрограмно (закреслено, внизу) робив те, що я хотів, це можна зробити простіше і з більш чистим кодом, використовуючи Environment.GetEnvironmentVariables () .

Одним із варіантів було б сканування всіх змінних середовища в системі та спробу довести наступне:

1) Чи значення змінної середовища є каталогом? (і якщо так ..)

2) Чи містить цей каталог python.exe?

Мені вдалося це зробити програмно, виконавши setкоманду через API .Net Process . setКоманда, коли використовується без параметрів, повертає всі змінні оточення в використанні системи. Тож я міг би проаналізувати, а потім організувати результати STDOUT, що випромінюються set, та екранувати їх, щоб побачити, що в кінцевому підсумку (і я маю на увазі що- небудь ), доступне через системне оточення, в кінцевому підсумку python.exe.

На цій сторінці обговорюється setкоманда:

Введіть SET без параметрів, щоб відобразити всі поточні змінні середовища.

Для ілюстрації я написав комбінацію методів (і хелперного класу ), що робить те, про що я говорив вище. Вони можуть бути оптимізовані, і вони можуть використовувати деякі куленепробивні (Try..Catch тощо), але якщо на комп’ютері БУДЬ будь-яка вказівка ​​середовища python.exe, цей підхід повинен знайти його! Мене не хвилює , якщо змінна називається PATH, ABBRACADABBRAабо будь-який .. якщо він вказує на python.exeце має знайти його.

// C#, you'll need these using statements:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;

Ось termsмасив рядків, з якими ви переходите до програми, шукати або ім'я змінної середовища, або її nзначення (тобто PATHможе мати кілька значень, але більшість інших варіантів матиме лише одне). Переконайтесь, що всі рядки в termsПОВЕРНЕННІ!

(Коли я тестував це, я просто використав "PYTHON", який знайдено C:\Python27\python.exeв моїй домашній системі. Але ви можете легко розширити його, щоб включити ще один рядок [] термінів, якщо хочете додатково перевірити шлях python.exeповернених кандидатів --- для наприклад, щоб побачити, чи були вони у кошику ArcGIS тощо)

// Top-level method that organizes everything below..
private void scrapeEnvironmentVariables(string[] terms)
{
    // !! ValueObject !! This is a Helper Class, find it at the bottom..
    List<ValueObject> voList = buildListOfEnvironmentObjects();

    foreach (ValueObject vo in voList)
    {
        bool candidateFound = ObjectMatchesSearchTerms(vo, terms);

        if (candidateFound)
        {    
            string exeCandidate = "";
            foreach (string unlikelyPath in vo.values)
            {
                if (Directory.Exists(unlikelyPath))
                {
                    string unlikelyExe = unlikelyPath + "\\python.exe";
                    if(File.Exists(unlikelyExe))
                        exeCandidate = unlikelyExe;
                }

                if (exeCandidate != "")
                {
                    break;
                    // At this point, exeCandidate is a fully-qualified
                    // path to python.exe..
                }
            }

            // If you only want the first hit, break here..
            // As-is, the code will look for even more matches.
            //if (breakOnFirstHit)
            //    break;
        }
    }
}


// Execute Environment.GetEnvironmentVariables() and organize the 
// key..value pairs into 1:n ValueObjects (see Helper Class below).
private List<ValueObject> buildListOfEnvironmentObjects()
{
    // Return a List of 1:n key..value objects.
    List<ValueObject> voList = new List<ValueObject>();

    IDictionary variableDictionary = Environment.GetEnvironmentVariables();
    foreach (DictionaryEntry entry in variableDictionary)
    {
        // Explode multi-values into a List of values (n).
        List<string> values = new List<string>();
        string[] rawValues = ((string)entry.Value).Split(';');
        foreach (string value in rawValues)
            if (value != "") values.Add(value.ToUpper());

        ValueObject valueObject = new ValueObject();
        valueObject.key = ((string)entry.Key).ToUpper();
        valueObject.values = values.ToArray();

        voList.Add(valueObject);
    }
    return voList;
}


// Compare the key and any value(s) in a ValueObject with all the
// terms submitted to the top-level method. If **ALL** the terms
// match (against any combination of key..value), it returns true.
private bool ObjectMatchesSearchTerms(ValueObject vo, string[] terms)
{
    int matchCount = 0;

    foreach (string term in terms)
    {
        if (vo.key.Contains(term))              // screen the key
            matchCount++;

        foreach (string value in vo.values)     // screen N values
        {
            if (value.Contains(term))
                matchCount++;
        }
    }

    // Test against >= because it's possible the match count could
    // exceed the terms length, like if a match occurred in both the
    // key and the value(s). So >= avoids omiting that possibility.
    return (matchCount >= terms.Length) ? true : false;
}    

І в нижній частині свого основного класу я включив наступний клас помічників :

class ValueObject : Object
{
    public ValueObject() { } // default constructor

    public string key;
    public string[] values;
}

1
Це неміцно, оскільки користувач може налаштувати каталог встановлення Python у програмі встановлення ArcGIS Desktop. Також PYTHONPATHзмінна НЕ та, яку ви хочете.
blah238

@ blah238, іноді все те, що маєш, крихке. Я насправді був здивований, побачивши, що Дуга провідна проти PYTHONPATH. Це встановлення за замовчуванням 9.2. Тим не менше, ОП запитала, як програмно дістатися до ArcGIS python.exe, і підхід, який я рекомендував, неміцний чи ні, робить це.
elrobis

Не можу сказати, що я розумію перемогу, чи справді ця відповідь " не корисна "? Це може бути не дивовижним , але, безумовно, це варіант, мабуть, буде працювати для типової установки Arc, і, принаймні, додає щось корисне для потоку - конкретно, він ілюструє встановлення Arc за замовчуванням, вирішивши зв’язати свій python. EXE із змінною середовища, відмінною від PATH.
elrobis

Вибачте, але ви невірні. Змінна PYTHONPATH використовується Python для пошуку модулів, а не ArcGIS для пошуку Python. Перевірте посилання.
blah238

@ blah238, я думаю, що скріншот був надзвичайним / неясним моментом, який я намагався зробити. (Зокрема, моя пропозиція до ОП не мала наміру підкреслювати PYTHONPATH, що щойно сталося єдиним варіантом у цій конкретній системі, що вказує на це python.exe.) У будь-якому разі я переробив свою відповідь, щоб включити робочий приклад C #, і я буду вдячний. знаючи, чи ви все ще не згодні з таким підходом. Дякую / Є.
elrobis

4

Я хотів би запропонувати альтернативне рішення, виходячи з мого коментаря до питання вище. Для поточного проекту я роблю щось дуже схоже; У мене є надбудова .NET, коли користувач натискає кнопку в інтерфейсі ArcMap, запускається скрипт Python. Я зробив встановлення змінної середовища PATH для виконуваного файлу ArcGIS Python, тому мені не потрібно хвилюватися про включення шляху до Python exe в мій код .NET.

Тепер, перебуваючи в розробці, тестери просто встановлюють змінну PATH вручну. Але в кінцевому підсумку у мене буде створений інсталятор Windows (exe), який буде встановлювати надбудову, встановлювати будь-які залежності Python та встановлювати всі необхідні змінні PATH. Для цього я використовую Nullsoft Scriptable Install System (NSIS) , відкриту систему для створення інсталяторів Windows. Ось код, який я розробив до цих пір, який є досить грубим. В основному, він реєструється в реєстрі, щоб побачити, чи існують цікаві змінні PATH, і якщо вони відсутні, вони додають їх. Доводиться, звичайно, працювати як адміністратор.

include "StrFunc.nsh"
!include "LogicLib.nsh"

/*
  Name: VIESORE_Installer.nsi
  Author: Chad Cooper, CAST
  Date: 7/16/2012
  Purpose: NSIS installer script for .exe creation by NSIS. Installs VIESORE components and sets up environment.
*/

Name "VIESORE"
Caption "VIESORE Installer"
Outfile "VIESOREInstaller.exe"

RequestExecutionLevel admin

# Initialize functions
${StrLoc}
# Initialize user variables
Var path

Section "Set SYSTEM PATH environmental variables"
    ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
    ${StrLoc} $1 $0 "C:\Python26\ArcGIS10.0" ">"
    ${StrLoc} $2 $0 "C:\Python26\ArcGIS10.0\Scripts" ">"
        ${StrLoc} $3 $0 "C:\Python26\ArcGIS10.0\Lib\site-packages" ">"
        ${StrLoc} $4 $0 "C:\Program Files\e-on software\Vue 10 Infinite\Application" ">"
        # Test to see if env vars exist in current system PATH, if not add them to $path variable
        ${If} $3 == ""
                StrCpy $path "C:\Python26\ArcGIS10.0\Lib\site-packages"
        ${EndIf}
        ${If} $2 == ""
                StrCpy $path "C:\Python26\ArcGIS10.0\Scripts;$path"
        ${EndIf}
        ${If} $1 == ""
                StrCpy $path "C:\Python26\ArcGIS10.0;$path"
        ${EndIf}
        ${If} $4 == ""
                StrCpy $path "C:\Program Files\e-on software\Vue 10 Infinite\Application;$path"
        ${EndIf}
        DetailPrint "$path written to system PATH"
    WriteRegStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;$path"
    ReadRegStr $5 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
    DetailPrint "New Path: $5"
SectionEnd

Отже, знову ж таки, це не знаходить шлях до exe ArcGIS Python, але дозволяє надати кінцевому користувачеві повноваження, щоб правильно та легко встановити його.


+1 Я повністю погоджуюся з цією рекомендацією --- де на високому рівні Чад каже: "не працюйте з проблемою назад, щоб вивести екземпляр python Arc, скоріше скористайтеся інсталятором і залиште його на SysAdmin, щоб встановити правильний python екземпляр. " @ChadCooper, чи дає NSIS будь-який контроль у користувальницькому інтерфейсі, щоб ви могли змінити ці шляхи за замовчуванням, якщо вирішите? Я не бачу цього, що мається на увазі під кодом, але я думаю, що він є.
elrobis

@elrobis - Я думаю, що ви можете змінити / відредагувати / змінити існуючі - NSIS дуже настроюється і може дозволити вам створити досить гладкий інсталятор - ви просто повинні розібратися з кодом, щоб написати його.
Чад Купер

Створення інсталятора для додатку просто здається трохи божевільним. Крім того, які зміни вам потрібно внести для підтримки 10.1, 10.2 тощо, а також 10.0?
blah238

@ blah238 - так, це здається божевільним, але мій інсталятор для цього конкретного проекту буде робити набагато більше, як говорили. Моя надбудова суворо становить 10.0. Я думаю, що для різних версій ArcGIS ви можете перевірити реєстр, щоб побачити, яка версія встановлена, а потім діяти відповідно.
Чад Купер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.