프로그래밍 방식으로 ArcMap에서 사용하는“Python.exe”의 경로를 얻는 방법


16

C #에서 ArcMap 추가 기능을 사용하고 있습니다. C # 코드에서 일부 Python 스크립트를 실행했습니다. 이제 해당 스크립트를 실행하기 위해 파이썬 코드를 하드 코딩했습니다. 그러나 이것은 이식성이 없습니다. 그래서 코드에서 Python 실행 파일의 경로를 가져 와서 사용하고 싶습니다.

질문:

C # 코드에서 ArcMap이 사용하는 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. 파이썬과 관련된 "참"은 파이썬이 ArcGIS와 함께 설치됨을 의미합니다
  2. ArcGIS 10.0과 상위 버전의 레지스트리 키는 동일한 프로세스로 작성됩니다.

내 추측에 대한 설명을 얻을 수 있도록 도와주세요.


5
당신은 만들 생각 해 봤나 스크립트 도구ArcObjects에서 그것을 실행 ?
blah238

3
PATH 환경 변수를 ArcGIS Python exe로 설정하여 애드 인의 설치 요구 사항이 될 수 있습니까?
채드 쿠퍼

모두 @ChadCooper의 생각이 가장 좋은 방법이어야한다고 말했습니다. 거꾸로 작업하지 말고 설치시 한 번만 설정하십시오.
elrobis

@ elrobis : PATH 환경에서 경로를 설정하는 것이 좋습니다. 그러나 파이썬을 찾고 사용자를 방해하지 않고 모든 것을 할 수있는 방법이 있는지 알고 싶었습니다.
Emi

귀하의 제안에 감사드립니다. 스크립트 도구를 사용한 적이 없습니다. 그것에 대해 알아야 할 수도 있습니다
Emi

답변:


2

두 번째 코드 예제를 가져 와서 64 및 32 비트 OS 모두에서 작동하게하고 조금 단순화했습니다. Windows 7 64 비트에서는 10.1에서 작동하지만, 가능한 한 많은 환경에서 테스트하고 필요한 방어 적 프로그래밍 검사를 다시 추가해야합니다.

Python없이 ArcGIS Desktop 10.1을 새로 설치 한 후, "Python"True / False 값은 물론 Python10.x 하위 키가 포함되어 있지 않다는 것을 알았습니다. 알고있다).

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

Python이 포함 된 Desktop 10.1 시스템에서는을 반환합니다 C:\Python27\ArcGIS10.1\python.exe. Python이없는 Desktop 10.1 시스템에서는 Python10.x 키가 없기 때문에 InvalidOperationException이 발생합니다.

바라건대 이것은 실제로 달성하려는 모든 것을 도와줍니다. 놀랍게도 여전히 나에게 분명하지 않습니다.


7

실행 주제 는 Python 실행 파일을 찾는 대신 위치를 한정하지 않고 쉘을 cmd.exe실행하고 실행 하도록 제안 python.exe합니다. 이, 그러나주의 해야 작업는 ArcGIS 데스크탑 때문에 설치 세트까지 (편집 : 최근 10.1에서 테스트, 그것을하지 않습니다) 의 경로에 의존 python.exe사용자에 추가되는 PATH환경 변수입니다.

또 다른 방법은 만드는 것입니다 스크립트 도구ArcObjects에서 실행 .

python.exeArcObjects + 스크립트 도구 접근 방식을 확장 하여 ArcGIS 버전의 경로를 실제로 따르는 경우 출력 만 값이 인 Python 스크립트 도구를 만들 수 있습니다 sys.exec_prefix. ArcGIS 버전의 Python을 포함하는 폴더의 경로입니다 (예 :) C:\Python27\ArcGIS10.1.

참고 : in-process를 실행할 때 sys.executable경로를 ArcMap.exeNOT으로 반환하므로 python.exe해당 변수를 사용하지 않는 것이 좋습니다.

ArcObjects에서 스크립트 도구를 호출하고 반환 된 IGeoProcessorResult객체 에서 출력을 가져옵니다 .

업데이트 : 다음은 ArcMap에서 python.exe사용되는 경로를 표시하는 애드 인 내에 패키지화 된 스크립트 도구를 사용하는 샘플 ArcMap 애드 인 프로젝트 (VS2010, .NET 3.5)입니다 . http://wfurl.com/cbd5091

클릭 한 번의 버튼이며 다음과 같은 경로의 메시지 상자가 나타납니다.

단추 메세지 박스

흥미로운 코드 조각들 :

  • 파이썬 스크립트 :

    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 환경 변수에 설정한다고 설명하지 않습니다. 따라서 파이썬의 경로가 PATH 환경 변수에 없을 수 있습니다. 그런 다음 오류가 발생합니다. 그래서 파이썬 실행 파일 경로가 사용자의 PATH 환경 변수에 있는지 어떻게 확인할 수 있습니까?
Emi

2
인생의 대부분의 일과 컴퓨팅처럼 당신이 할 수있는 모든 것은 가정하고 희망하는 일을하고, 그렇지 않을 때 대체 계획을 세우는 것입니다 (PATH 환경 변수에 추가하는 지침을 제공하십시오). 즉, 일반 설치 인 경우 ArcGIS Desktop 설치 관리자가 해당 경로를 PATH 환경 변수에 추가한다고 생각합니다.
blah238

2
arcgis 설치 파이썬이 경로에없는 많은 설치를 보았습니다. 두 개의 버전이 설치되어 있고 '잘못된'버전이 경로에있는 경우 어떻게해야합니까?
blindjesse

PATH환경 변수에 관계없이 ArcGIS의 Python 설치를 찾아야하는 세 번째 단락에서 솔루션을 제공했습니다 .
blah238

@ blah238은 스크립트 도구를 만들지 않아서 추가 기능을 이식성이 떨어 뜨리거나 추가 기능을 다른 컴퓨터에 설치하는 과정을 어렵게 만들 수 있습니까?
Emi

6

레지스트리에 액세스 할 수 있습니까?

ArcMap을 설치할 때 찾을 수 없으면 Python을 설치합니다. 파이썬이 이미 설치되어 있는지 레지스트리에서 확인합니다. 이것에 대한 표준 레지스트리 위치는 computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath 경로 위치의 기본 키 (2.7은 10.1, 2.6은 10.0 임)입니다.

이 키의 값이 정확하지 않은 이유를 생각할 수는 없지만 항상 이렇게 할 수 있습니다. 레지스트리의 Esri \ Desktop 하이브 내부에는 Python 위치가 있습니다. Python.exe가 있는지 확인하기 위해 추가 경로를 만들고 빌드 할 수있는 간단한 경로입니다. 예를 들어 64 비트 컴퓨터의 키는 다음 위치에 설치됩니다. computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 PythonDir 키 및 관련 경로 값 사용

그러나 나는 @ blah238 답변을 좋아합니다. 프로그램에서 프롬프트를 열고 실행하십시오. 왜 이것이 효과가 없는지 알 수 없습니다.


2
이 방법은 Python 설치가 여러 개있을 수 있으며 ArcGIS에서 사용하는 것을 프로그래밍 방식으로 간단하게 결정하는 방법이 없기 때문에 결함이 있습니다. 당신이 arcpy를 실행하지 않는다면 이것은 중요하지 않을 수 있습니다. 여전히 가장 강력한 솔루션은 레지스트리와 약간의 논리가 필요하다고 생각합니다. 나는 거기에 가지 않을 것이다.
blah238

논리는 최신 버전 2.7부터 시작하여 거꾸로 작동해야합니다. 새 버전의 Python을 설치 한 다음 이전 버전의 Python을 설치하는 이전 버전의 ArcGIS를 설치 한 경우에는 물론 실패 할 수 있습니다. 그렇습니다.이 잠재력에 동의하지만 그 가능성은 없습니다 (또는 arc10.1 = py2.7, arc10.0 = py26 ... 등을 100 % 확실하게 만들 수 있습니다). 내가 말했듯이, 가장 좋은 방법은 아마도 명령 프롬프트에 셸 아웃하는 것입니다.
KHibma December

@ KHibma 레지스트리를 통해 검색했습니다. 하지만 "PYTHON"키를 살펴보면 정말 귀찮습니다. 내 컴퓨터에는 두 개의 파이썬 버전이 설치되어 있으며 둘 다 반환합니다. "ESRI"키를 살펴보고 실제 값을 가진 "Python"하위 키가 있으면 "PythonDir"하위 키 값을 사용할 수 있다고 생각합니다. 그것은 내 경우에 작동 :)
Emi

"ESRI"키를 통해 레지스트리에서 파이썬 경로를 검색하는 잘못된 방법입니까? 또는 esri가 레지스트리에서 키와 값을 작성하는 데 사용하는 방식이 변경되어 코드를 읽을 수없는 가능성이
있습니까?

레지스트리를 "검색"할 때 위에서 제공 한 실제 경로를 사용한다는 의미입니다. 누군가가 더 잘 알지 못하면 레지스트리에서 레지스트리 키 위치는 기계마다 바뀌지 않습니다. 따라서 키가 존재하는지 확인하기 위해 경로를 하드 코딩하면됩니다.
KHibma

5

[편집] 원하는set 방식으로 프로그래밍 방식으로 실행 하면 (아래에서 설명), Environment.GetEnvironmentVariables ()를 사용하여보다 쉽고 깔끔한 코드로 수행 할 수 있습니다 .

한 가지 옵션은 시스템의 모든 환경 변수를 스캔하고 다음을 증명하는 것입니다.

1) 환경 변수 값이 디렉토리입니까? (그렇다면 ..)

2) 해당 디렉토리에 포함되어 python.exe있습니까?

.Net Process API를 통해 명령실행하여set 프로그래밍 방식 으로이 작업을 수행 할 수있었습니다 . 이 명령은 매개 변수없이 사용하면 시스템에서 사용중인 모든 환경 변수를 반환합니다. 내가 parase 수 있도록, 다음에서 방출 된 STDOUT 결과를 정리 하고, 무엇이든 무엇이든지 (그리고 나는 평균 있는지를 화면 ANYTHING 시스템 envionment를 통해 제공) 궁극적으로 지적했다 .setsetpython.exe

에서 이 페이지 논의 set명령을 :

매개 변수없이 SET를 입력하면 현재 환경 변수가 모두 표시됩니다.

설명하기 위해 위에서 논의한 것을 수행 하는 메소드와 헬퍼 클래스 의 조합을 작성했습니다 . 이것들은 최적화 될 수 있으며, 방탄 (Try..Catch 등)을 사용할 수 있지만 컴퓨터에를 가리키는 ANY 환경 변수가 있으면 python.exe이 방법을 찾으십시오! var에 호출하면 난 상관 없어 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이 대문자 인지 확인하십시오 !

(이 테스트를 할 때, 나는 C:\Python27\python.exe내 홈 시스템 에서 찾은 "PYTHON"을 사용했습니다 . 그러나 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
사용자는 ArcGIS Desktop 설치 프로그램에서 Python 설치 디렉토리를 사용자 정의 할 수 있으므로 취약합니다. 또한 PYTHONPATH변수는 원하는 변수가 아닙니다.
blah238

@ blah238, 때로는 깨지기 쉬운 것이 전부입니다. 실제로 PYTHONPATH와 Arc가 연결되어 있다는 사실에 놀랐습니다. 기본 9.2 설치입니다. 그럼에도 불구하고 OP는 프로그래밍 방식으로 ArcGIS python.exe에 도달하는 방법을 물었고, 내가 권장하는 접근 방식은 깨지기 쉬운 지 여부입니다.
elrobis

다운 투표를 이해한다고 말할 수 없습니다.이 답변이 실제로 " 유용하지 않습니다 "입니까? 그것은되지 않을 수도 굉장 하지만 아마 설치 전형적인 아크 위해 일하는 것, 확실히 옵션, 그리고 최소한,이 스레드에 도움이 뭔가를 추가 - 구체적으로는 아크가 파이썬을 연결하는 말인가 기본 설치를 보여줍니다. 이외의 환경 변수가있는 exe PATH.
elrobis

죄송하지만 잘못되었습니다. PYTHONPATH 변수는 Python 에서 ArcGIS가 아닌 Python 을 찾기 위해 모듈을 찾는 데 사용 됩니다 . 링크를 확인하십시오.
blah238

@ blah238, 스크린 샷이 내가 만들고자하는 포인트를 압도적이거나 모호하게 생각합니다. (특히, 영업 이익 내 제안을 강조하려는되지 않은 PYTHONPATH단지 우연히 것으로, 에 다시 가리키는 특정 시스템에서 VAR python.exe.) 어쨌든, 난 작업 C # 코드 예제를 포함하는 내 대답을 철저하게, 그리고 감사하겠습니다 이 접근법에 여전히 동의하지 않는지 알고 있습니다. 감사합니다 / E.
elrobis

4

위의 질문에 대한 의견을 바탕으로 대체 솔루션을 제공하고 싶습니다. 현재 프로젝트의 경우 매우 비슷한 일을하고 있습니다. 사용자가 ArcMap UI에서 버튼을 클릭하면 Python 스크립트가 실행되는 .NET 추가 기능이 있습니다. PATH 환경 변수를 ArcGIS Python 실행 파일로 설정하여 .NET 코드에 Python exe의 경로를 포함시키는 것에 대해 걱정할 필요가 없도록했습니다.

이제 개발 중에 테스터는 PATH 변수를 수동으로 설정하고 있습니다. 그러나 결국 추가 기능을 설치하고 Python 종속성을 설치하고 필요한 PATH 변수를 설정하는 Windows 설치 프로그램 (exe)을 만들 것입니다. 이를 위해 Windows 설치 관리자를 만들기위한 오픈 소스 시스템 인 Nullsoft Scriptable Install System (NSIS) 을 사용하고 있습니다. 여기까지 내가 지금까지 작성한 코드가 있습니다. 기본적으로 레지스트리에서 관심있는 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

다시 말하지만, 이것은 ArcGIS Python exe의 경로를 찾지 못하지만 최종 사용자가 적절하고 쉽게 설정할 수있는 힘을 줄 수 있습니다.


+1이 권장 사항에 전적으로 동의합니다. 높은 수준에서 Chad는 "Arc의 파이썬 인스턴스를 추론하기 위해 문제를 거꾸로하지 말고 설치자를 사용하여 올바른 Python을 설정하도록 SysAdmin에 맡기십시오"라고 말합니다. 예." @ChadCooper, NSIS는 UI 컨트롤을 제공하므로 원하는 경우 기본 경로를 무시할 수 있습니까? 코드가 암시하는 것을 보지 못했지만 거기에 내기를 걸고 있습니다.
elrobis

@elrobis-기존 항목을 재정의 / 편집 / 변경할 수 있음-NSIS는 매우 구성 가능하며 매끄러운 매끄러운 설치 프로그램을 작성할 수 있습니다. 코드를 작성해야합니다.
채드 쿠퍼

애드 인용 설치 프로그램을 만드는 것은 약간 미친 것 같습니다. 또한 10.0뿐만 아니라 10.1, 10.2 등을 지원하기 위해 어떤 수정이 필요합니까?
blah238

@ blah238-그래, 미친 것처럼 보이지만,이 특정 프로젝트의 설치 프로그램은 이야기 한 것처럼 더 많이 할 것입니다. 내 애드 인은 엄격하게 10.0입니다. 다른 버전의 ArcGIS에 대해 레지스트리를 확인하여 설치된 버전을 확인한 다음 그에 따라 조치를 취할 수 있습니다.
채드 쿠퍼
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.