Jak mogę programowo uzyskać ścieżkę „Python.exe” używaną przez ArcMap

16

Pracuję z dodatkiem ArcMap w C #. Z kodu C # wykonałem kilka skryptów Python. Teraz, aby uruchomić ten skrypt, mam zakodowaną ścieżkę do Pythona. Ale to nie jest przenośne. Tak więc chcę uzyskać ścieżkę do pliku wykonywalnego Python z kodu i użyć go.

Pytanie:

Jak mogę uzyskać ścieżkę do pliku wykonywalnego Pythona używanego przez ArcMap z kodu C #?

EDYTOWAĆ :

Z twoich sugestii na razie używam „środowiska ścieżek”, aby uzyskać ścieżkę do Pythona.

//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;
        }
    }
}

Ale jest problem:

Kiedy na moim komputerze jest zainstalowana inna wersja Pythona, nie ma gwarancji, że używam „python.exe”, ArcGIS również tego używa.

Nie doceniam używania innego narzędzia do uzyskania ścieżki „python.exe” . Naprawdę myślę, czy jest jakiś sposób na uzyskanie ścieżki z klucza rejestru. Dla „ArcGIS10.0” wygląd rejestru takich jak: wprowadź opis zdjęcia tutaj

W tym celu myślę o następującym sposobie zdobycia ścieżki:

//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 ;
}

Ale przed skorzystaniem z drugiej procedury muszę się upewnić co do moich domysłów. Domysłami są:

  1. „Prawda” powiązana z pythonem oznacza, że ​​Python jest instalowany z ArcGIS
  2. ArcGIS 10.0 i klucz rejestru wyższej wersji zostaną zapisane w tym samym procesie.

Proszę o pomoc w uzyskaniu wyjaśnień na temat moich domysłów.

Emi
źródło
5
Czy zastanawiałeś się nad utworzeniem narzędzia skryptowego i uruchomieniem go z ArcObjects ?
blah238,
3
Czy możesz nie tylko ustawić zmienną środowiskową PATH na ArcGIS Python exe jako wymaganie instalacyjne dla Twojego dodatku?
Chad Cooper,
Ogólnie rzecz biorąc, myśl @ ChadCooper musi być najlepszym sposobem. Zamiast próbować działać wstecz, wystarczy ustawić go raz na zawsze w czasie instalacji.
elrobis
@elrobis: Wiem, ustawienie ścieżki w środowisku PATH jest dobrym sposobem. Ale chciałem wiedzieć, czy jest jakiś sposób na znalezienie pytona i zrobienie wszystkiego bez zakłócania działania użytkownika.
Emi
@ blah238 dzięki za sugestię. Nigdy nie pracowałem z narzędziem skryptowym. Być może muszę się o tym dowiedzieć
Emi,

Odpowiedzi:

2

Wziąłem twój drugi przykład kodu, sprawiłem, że działa zarówno na 64-bitowym, jak i 32-bitowym systemie operacyjnym, i trochę go uprościłem. Działa dla mnie w wersji 10.1 na Windows 7 64-bit, ale oczywiście powinieneś przetestować go na tak wielu środowiskach, jak to możliwe, i dodać ponownie wszelkie kontrole programowania obronnego, które uważasz za konieczne.

Po przetestowaniu czystej instalacji ArcGIS Desktop 10.1 bez Pythona stwierdziłem, że nie zawiera on podklucza Python10.x, nie mówiąc już o wartości True / False „Python” (wciąż nie jestem pewien, do czego to służy, w razie potrzeby skontaktuj się z obsługą ESRI wiedzieć).

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;
}

Na komputerze stacjonarnym 10.1 z Pythonem funkcja ta powraca C:\Python27\ArcGIS10.1\python.exe. Na komputerze stacjonarnym 10.1 bez Pythona powoduje to wyjątek InvalidOperationException ze względu na brak klucza Python10.x.

Mam nadzieję, że to pomoże ci w tym, co naprawdę próbujesz osiągnąć, co - o dziwo - wciąż nie jest dla mnie jasne.

blah238
źródło
7

Zamiast szukać pliku wykonywalnego w języku Python, ten temat pomocy sugeruje cmd.exeuruchomienie i uruchomienie python.exebez określania jego lokalizacji. Należy jednak pamiętać, że powinno to działać, ponieważ konfigurator instalatora ArcGIS Desktop (edycja: ostatnio przetestowana w wersji 10.1, nie działa) zależy od ścieżki python.exedodawania do PATHzmiennej środowiskowej użytkownika .

Innym podejściem jest utworzenie narzędzia skryptowego i uruchomienie go z ArcObjects .

Jeśli naprawdę python.exepodążasz ścieżką do wersji ArcGIS , rozszerzając podejście narzędzia skryptowego ArcObjects +, możesz utworzyć narzędzie skryptowe Python, którego jedyną wartością wyjściową jest wartość sys.exec_prefix. Jest to ścieżka do folderu zawierającego wersję Pythona ArcGIS, np C:\Python27\ArcGIS10.1.

Uwaga dodatkowa : sys.executablezwraca ścieżkę do ArcMap.exei NIE python.exepodczas uruchamiania w trakcie, dlatego nie sugeruję używania tej zmiennej.

Wywołaj narzędzie skryptowe z ArcObjects i uzyskaj dane wyjściowe ze zwróconego IGeoProcessorResultobiektu.

Aktualizacja: Oto przykładowy projekt dodatku ArcMap (VS2010, .NET 3.5), który używa narzędzia skryptowego spakowanego w dodatku, który po prostu wyświetla ścieżkę do python.exeużywanego przez ArcMap: http://wfurl.com/cbd5091

To tylko kliknięty przycisk i wyskakuje okno komunikatu ze ścieżką:

Przycisk Skrzynka pocztowa

Ciekawe fragmenty kodu:

  • Skrypt w języku 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)
  • Funkcja 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();
    }
blah238
źródło
2
Ale ten dokument nie mówi, że instalator ArcGIS Desktop ustawia ścieżkę do python.exe do zmiennej środowiskowej PATH użytkownika. Możliwe więc, że ścieżka pytona nie znajduje się w zmiennej środowiskowej PATH. Następnie utworzy błąd. Skąd więc mam pewność, że ścieżka wykonywalna Pythona znajduje się w zmiennej środowiskowej PATH użytkownika.
Emi,
2
Nie możesz, podobnie jak większość rzeczy w życiu i komputerach, wszystko, co możesz zrobić, to przyjąć założenia i mieć nadzieję, że coś zadziała, i mieć plan awaryjny, gdy się nie powiedzie (dostarcz instrukcje dotyczące dodawania go do zmiennej środowiskowej PATH). To powiedziawszy, jeśli jest to normalna instalacja, uważam, że instalator ArcGIS Desktop dodaje tę ścieżkę do zmiennej środowiskowej PATH.
blah238,
2
Widziałem wiele instalacji, w których python zainstalowany na Arcgis nie był na ścieżce. A jeśli zainstalowane są dwie wersje, a „niewłaściwa” jest na ścieżce?
blindjesse 22.12.12
W trzecim akapicie zaproponowałem rozwiązanie, które powinno znaleźć instalację Pythona w ArcGIS niezależnie od PATHzmiennej środowiskowej.
blah238,
@ blah238 czy tworzenie narzędzia skryptowego nie powoduje, że mój dodatek jest mniej przenośny, ani nie utrudnia procesu instalacji dodatku na innym komputerze?
Emi
6

Czy będziesz miał dostęp do rejestru?

Podczas instalacji ArcMap zainstaluje Python, jeśli nie będzie w stanie go znaleźć. Sprawdza w rejestrze, czy Python jest już zainstalowany. Uważam, że standardową lokalizacją rejestru dla tego jest: komputer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath Z domyślną lokalizacją klucza ścieżki (2.7 to 10.1, 2.6 to 10.0)

Nie mogę wymyślić powodu, dla którego / dlaczego wartość tego klucza byłaby niepoprawna, ale zawsze możesz pójść w ten sposób: Wewnątrz rejestru Esri \ Desktop rejestru znajduje się lokalizacja w języku Python. Jest to prosta ścieżka, którą można uzyskać, a następnie zbudować dalsze ścieżki, aby upewnić się, że istnieje plik Python.exe. Na przykład klucz na komputerze 64-bitowym zostanie zainstalowany na: komputerze \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 Z kluczem PythonDir i powiązaną wartością ścieżki

Ale podoba mi się odpowiedź @ blah238. Po prostu otwórz monit w swoim programie i uruchom go tam. Nie widzę powodu, dla którego to nie działałoby.

KHibma
źródło
2
Takie podejście jest również błędne, ponieważ może istnieć wiele instalacji Pythona i nie ma prostego sposobu programowego określenia, która z nich jest używana przez ArcGIS. Jeśli nie korzystasz z Arcpy, może to nie mieć znaczenia. Myślę jednak, że najbardziej niezawodne rozwiązanie wymagałoby rejestru i logiki. Ale nie zamierzam tam iść.
blah238,
Cóż, logika musiałaby zaczynać się od najnowszej wersji 2.7 i działać wstecz. To oczywiście może się nie powieść, jeśli zainstalujesz nową wersję Pythona, a następnie zainstalujesz starszą wersję ArcGIS, która zainstaluje starszą wersję Pythona. Tak, zgadzam się, że jest ten potencjał, ale jest mało prawdopodobny (lub możesz po prostu skonstruować odnośnik arc10.1 = py2.7, arc10.0 = py26 ... itd., Aby mieć 100% pewności). Jak powiedziałem, najlepsza metoda prawdopodobnie wystarczy po prostu wydać polecenie w wierszu polecenia.
KHibma,
@KHibma Przeszukałem rejestr. Ale myślę, że to naprawdę kłopotliwe, gdy przejrzę klucz „PYTHON”. Na moim komputerze są zainstalowane dwie wersje Pythona i zwraca obie. Myślę, że dobrym pomysłem jest przejrzenie klucza „ESRI”, a jeśli istnieje podklucz „Python” z prawdziwą wartością, to mogę wziąć wartość podklucza „PythonDir”. Działa w moim przypadku :)
Emi,
Czy to zły sposób przeszukiwania ścieżki Pythona w rejestrze za pomocą klucza „ESRI”? A może istnieje szansa, że ​​sposób, w jaki esri używa do tworzenia kluczy i wartości w rejestrze, może ulec zmianie, a kod może go nie odczytać
Emi
Kiedy mówię „przeszukuj” rejestr, mam na myśli faktyczne ścieżki podane powyżej. Chyba że ktoś wie lepiej, lokalizacja kluczy rejestru (w rejestrze) nie zmieniłaby się z komputera na komputer. Więc po prostu zakoduj ścieżki, aby sprawdzić, czy istnieją klucze, jeśli tak, to
jaka
5

[Edytuj] Wykonując setprogramowo (wykreślone poniżej) zrobiłem to, co chciałem, można to zrobić łatwiej i przy pomocy czystszego kodu za pomocą Environment.GetEnvironmentVariables () .

Jedną z opcji byłoby skanowanie każdej zmiennej środowiskowej w systemie i próba udowodnienia, co następuje:

1) Czy wartość zmiennej środowiskowej jest katalogiem? (a jeśli tak..)

2) Czy ten katalog zawiera python.exe?

Udało mi się to zrobić programowo, wykonując setpolecenie za pośrednictwem interfejsu API procesu .Net . setPolecenia, jeżeli jest stosowany bez parametru, zwraca wszystkie zmienne środowiskowe używane przez system. Mogłem więc sparować, a następnie uporządkować emitowane wyniki STDOUT seti przejrzeć je, aby zobaczyć, czy coś (i mam na myśli WSZYSTKO ) dostępne w środowisku systemowym ostatecznie wskazuje python.exe.

Z tej strony omawiającej setpolecenie:

Wpisz SET bez parametrów, aby wyświetlić wszystkie bieżące zmienne środowiskowe.

Aby to zilustrować, napisałem kombinację metod (i klasy pomocniczej ), która robi to, co omówiłem powyżej. Można je zoptymalizować i mogą one użyć niektórych kuloodpornych (Try..Catch itp.), Ale jeśli komputer ma DOWOLNĄ zmienną środowiskową wskazującą na python.exeto, to podejście powinno ją znaleźć! Nie obchodzi mnie, czy var jest wywoływany PATH, ABBRACADABBRAczy cokolwiek ... jeśli to wskazuje python.exe, to powinno go znaleźć.

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

Oto termstablica ciągów, które przekazujesz do procedury w poszukiwaniu nazwy zmiennej środowiskowej lub jej nwartości (tzn. PATHMoże mieć kilka wartości, ale większość innych zmiennych będzie miała tylko jedną). Upewnij się, że wszystkie napisy termssą DUŻE!

(Kiedy to przetestowałem, użyłem po prostu „PYTHON”, który znalazłem C:\Python27\python.exew moim systemie domowym. Ale możesz z łatwością rozszerzyć go o kolejny ciąg [] terminów, jeśli chcesz dalej sprawdzić ścieżkę python.exezwróconych kandydatów --- dla przykład, aby sprawdzić, czy znajdują się w koszu ArcGIS itp.)

// 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;
}    

Na dole mojej głównej klasy umieściłem następującą klasę pomocnika :

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

    public string key;
    public string[] values;
}
elrobis
źródło
1
Jest to niestabilne, ponieważ użytkownik może dostosować katalog instalacyjny Python w instalatorze ArcGIS Desktop. Również PYTHONPATHzmienna NIE jest tą, którą chcesz.
blah238,
@ blah238, czasami kruche to wszystko, co masz. Byłem naprawdę zaskoczony, widząc, że Arc jest podłączony do PYTHONPATH. To domyślna instalacja 9.2. Niemniej jednak OP zapytał, jak programowo dostać się do ArcGIS python.exe, i podejście, które zaleciłem, kruche lub nie, robi to.
elrobis,
Nie mogę powiedzieć, że rozumiem głosowanie w dół, czy ta odpowiedź naprawdę „ nie jest przydatna ”? To może nie być niesamowite , ale z pewnością jest to opcja, prawdopodobnie działałoby w przypadku typowej instalacji Arc, a przynajmniej dodaje coś pomocnego do wątku - w szczególności ilustruje domyślną instalację Arc, która decyduje się na połączenie swojego pytona. exe ze zmienną środowiskową inną niż PATH.
elrobis,
Przepraszam, ale się mylisz. Zmienna PYTHONPATH jest używana przez Python do wyszukiwania modułów, a nie przez ArcGIS do wyszukiwania Python. Sprawdź link.
blah238,
@ blah238, myślę, że zrzut ekranu przytłaczał / zasłaniał punkt, który próbowałem zrobić. (W szczególności moja sugestia dla OP nie zamierzała podkreślać PYTHONPATH, że akurat był to jedyny war w tym konkretnym systemie, który wskazuje z powrotem python.exe.) W każdym razie przerobiłem moją odpowiedź, aby zawierała działający przykład kodu C # i byłbym wdzięczny wiedząc, czy nadal nie zgadzasz się z tym podejściem. Dzięki / E.
elrobis
4

Chciałbym zaproponować alternatywne rozwiązanie w oparciu o mój komentarz w powyższym pytaniu. W przypadku bieżącego projektu robię coś bardzo podobnego; Mam dodatek .NET, który gdy użytkownik kliknie przycisk w interfejsie ArcMap, uruchamia skrypt w języku Python. Wymagałem, aby zmienna środowiskowa PATH ustawiona na plik wykonywalny ArcGIS Python była wymogiem, dzięki czemu nie muszę się martwić o włączenie ścieżki do pliku exe Python w moim kodzie .NET.

Teraz, podczas opracowywania, testerzy po prostu konfigurują zmienną PATH ręcznie. Ale w końcu utworzę instalator Windows (exe), który zainstaluje dodatek, zainstaluje dowolne zależności Pythona i ustawi wszelkie potrzebne zmienne PATH. W tym celu korzystam z Nullsoft Scriptable Install System (NSIS) , systemu open source do tworzenia instalatorów Windows. Oto kod, który opracowałem do tej pory, co jest dość szorstkie. Zasadniczo sprawdza w rejestrze, czy interesujące są zmienne PATH, a jeśli nie są, dodaje je. Oczywiście musi być uruchamiany jako administrator.

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

Zatem znowu nie znajduje to ścieżki do exe ArcGIS Python, ale pozwala dać użytkownikowi końcowemu moc, aby ustawić go poprawnie i łatwo.

Chad Cooper
źródło
+1 Całkowicie zgadzam się z tym zaleceniem --- gdzie na wysokim poziomie, Chad mówi: „nie rozwiązuj problemu wstecz, aby wydedukować instancję Arc w Pythonie, a raczej użyj instalatora i pozostaw SysAdminowi, aby ustanowił poprawne python instancja." @ChadCooper, czy NSIS daje ci jakąkolwiek kontrolę interfejsu, abyś mógł zastąpić te domyślne ścieżki, jeśli tak wybierzesz? Nie widzę tego sugerowanego przez kod, ale założę się, że tam jest.
elrobis
@elrobis - Założę się, że możesz zastąpić / edytować / zmienić istniejące - NSIS jest bardzo konfigurowalny i pozwala ci zbudować całkiem sprytny instalator - po prostu musisz znaleźć kod, żeby go napisać.
Chad Cooper
Tworzenie instalatora dodatku wydaje się trochę szalone. Jakie modyfikacje należy wprowadzić w celu obsługi wersji 10.1, 10.2 itp., A także wersji 10.0?
blah238,
@ blah238 - tak, to wydaje się szalone, ale mój instalator tego konkretnego projektu będzie robił o wiele więcej, o czym mówiono. Mój dodatek jest przeznaczony wyłącznie dla wersji 10.0. Wydaje mi się, że dla różnych wersji ArcGIS można sprawdzić rejestr, aby sprawdzić, która wersja jest zainstalowana, a następnie podjąć odpowiednie działania.
Chad Cooper