ArcMap tarafından kullanılan “Python.exe” nin yolunu program aracılığıyla nasıl alabilirim?


16

C # ArcMap bir eklenti ile çalışıyorum. C # kodu, bazı Python komut dosyaları yürüttüm. Şimdi, bu komut dosyasını çalıştırmak için sabit kodlu python yolum var. Ancak bu taşınabilir değildir. Yani, koddan yürütülebilir Python yolunu almak ve kullanmak istiyorum.

Soru:

ArcMap tarafından kullanılan Python yürütülebilir dosyasının yolunu C # kodundan nasıl alabilirim?

DÜZENLE :

Önerilerinizden, şimdilik Python yolu almak için "yol ortamı" kullanıyorum.

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

Ama bir problem var:

Makineme farklı python sürümü yüklendiğinde, kullandığım "python.exe", ArcGIS de bunu kullanacağının garantisi yoktur.

"Python.exe" yol almak için başka bir araç kullanarak takdir etmiyorum . Yani, gerçekten kayıt defteri anahtarından yolu almanın herhangi bir yolu varsa düşünüyorum. For "ArcGIS10.0" kayıt görünüyor gibi: resim açıklamasını buraya girin

Ve bunun için, yolu elde etmenin aşağıdaki yolunu düşünüyorum:

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

Ancak ikinci prosedürü kullanmadan önce tahminlerimden emin olmalıyım. Tahminler:

  1. python ile ilişkili "True", python'un ArcGIS ile kurulu olduğu anlamına gelir
  2. ArcGIS 10.0 ve üst sürümün kayıt defteri anahtarı aynı işlemde yazılır.

Lütfen tahminlerimle ilgili herhangi bir açıklama almama yardımcı olun.


5
Bir komut dosyası aracı oluşturmayı ve bunu ArcObjects'ten yürütmeyi düşündünüz mü ?
blah238

3
Eklenti için bir kurulum şartı olarak sadece ArcGIS Python exe'ye ayarlanmış bir PATH çevresel değişkeni olamaz mı?
Chad Cooper

Hepsi, @ ChadCooper'ın düşüncesinin en iyi yol olması gerektiğini söyledi. Geriye doğru çalışmaya çalışmak yerine, kurulum zamanında bir kez ve herkes için ayarlayın.
elrobis

@elrobis: Biliyorum, PATH ortamında yolu belirlemek iyi bir yol. Ama python bulmak ve kullanıcıyı kesintiye uğratmadan her şeyi yapmak için herhangi bir yolu olup olmadığını bilmek istedim.
Emi

@ blah238 öneriniz için teşekkürler. Komut dosyası aracıyla hiç çalışmadım. Belki de öğrenmem gerek
Emi

Yanıtlar:


2

İkinci kod örneğinizi aldım, hem 64 hem de 32 bit işletim sistemlerinde çalıştım ve biraz basitleştirdim. Windows 7 64-bit'de 10.1'de benim için çalışıyor, ancak açıkçası mümkün olduğunca çok ortamda test etmeli ve gerekli olduğunu düşündüğünüz savunma programlama kontrollerine geri eklemelisiniz.

Temiz kurulum ArcGIS Desktop 10.1'i Python olmadan test ettikten sonra, Python10.x alt anahtarını içermediğini, "Python" Doğru / Yanlış değerini (yine de bunun için ne olduğundan emin değilseniz, belki de gerekirse ESRI desteğiyle iletişime geçtiğini) buldum. ) biliyorum.

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'lu bir Masaüstü 10.1 makinesinde bu geri döner C:\Python27\ArcGIS10.1\python.exe. Python içermeyen bir Masaüstü 10.1 makinesinde bu, Python10.x anahtarının bulunmaması nedeniyle bir InvalidOperationException oluşturur.

Umarım bu gerçekten başarmaya çalıştığınız her şeyde size yardımcı olur, ki bu inanılmaz - hala net değil.


7

Python yürütülebilir dosyasını aramak yerine, bu yardım konusu , konumunu nitelendirmeden bombardıman yapmayı cmd.exeve çalışmayı önerir python.exe. Bu Ancak unutmayın ki, gereken çalışmak ArcGIS'in çünkü yükleyici kurar (düzenleme: Son zamanlarda 10.1 test, yok mu) yolu üzerine dayanır python.exekullanıcının eklenmesini PATHortam değişkeni.

Başka bir yaklaşım, bir komut dosyası oluşturmak ve bunu ArcObjects'ten yürütmektir .

ArcGIS'in sürümüne giden yoldan gerçekten python.exesonraysanız, ArcObjects + script tool yaklaşımını genişleterek, tek çıkışı değeri olan bir Python script aracı oluşturabilirsiniz sys.exec_prefix. Bu, ArcGIS'in Python sürümünü içeren klasörün yoludur, örn C:\Python27\ArcGIS10.1.

Yan not : işlem sırasında çalıştırılır ve DEĞİL sys.executableyolunu döndürür , bu yüzden bu değişkeni kullanmanızı önermiyorum.ArcMap.exepython.exe

ArcObjects'ten komut dosyası aracını çağırın ve döndürülen IGeoProcessorResultnesneden çıktı alın .

Güncelleştirme: Eklenti içinde paketlenmiş bir komut dosyası kullanan python.exeve ArcMap tarafından kullanılan yolu gösteren örnek bir ArcMap eklenti projesi (VS2010, .NET 3.5) : http://wfurl.com/cbd5091

Sadece tıkladığınız bir düğme ve yolu içeren bir mesaj kutusu açar:

Buton Mesaj Kutusu

İlginç kod parçaları:

  • Python betiği:

    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 # işlevi:

    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
Ancak bu belge, ArcGIS Desktop yükleyicisinin python.exe dosyasına kullanıcının PATH ortam değişkenine giden yolu ayarladığını söylemez. Bu nedenle, python yolunun PATH ortam değişkeninde olmaması mümkündür. Sonra bir hata oluşturur. Peki, python çalıştırılabilir yolunun kullanıcının PATH ortam değişkeninde olduğundan nasıl emin olabilirim.
Emi

2
Hayattaki çoğu şey gibi ve yapabileceğiniz her şeyi hesaplamak, varsayımları yapmak ve şeylerin işe yaramasını umut etmek ve yapmadıklarında bir geri dönüş planına sahip olamazsınız (PATH ortam değişkenine eklemek için talimatlar verin). Bununla birlikte, normal bir kurulumsa, ArcGIS Desktop yükleyicisinin bu yolu PATH ortam değişkenine eklediğine inanıyorum.
blah238

2
Arcgis yüklü python'un yolunda olmadığı birçok kurulum gördüm. Yüklü iki sürüm varsa ve 'yanlış' sürüm yoldaysa ne olur?
blindjesse

3. paragrafımda, PATHortam değişkenine bakılmaksızın ArcGIS'in Python kurulumunu bulması gereken bir çözüm önerdim .
blah238

@ blah238, komut dosyası oluşturma aracı, eklentimi daha az taşınabilir hale getirmiyor veya eklentinin kurulum işlemini başkalarına zorlaştırmıyor mu?
Emi

6

Kayıt defterine erişiminiz olacak mı?

ArcMap'i yüklerken bulamazsa Python'u yükleyecektir. Python'un kurulu olup olmadığını görmek için kayıt defterine bakar. Bunun için standart kayıt defteri konumu olduğuna inanıyorum: bilgisayar \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath Path konumunun varsayılan bir anahtarı ile (2.7 10.1, 2.6 olmak 10.0)

Ne zaman / neden bu anahtarın değeri yanlış olacağını düşünemiyorum, ama her zaman bu şekilde gidebiliriz: Kayıt defterinin Esri \ Desktop kovanı içinde bir Python konumudur. Onun almak ve daha sonra bir Python.exe olduğundan emin olmak için daha fazla yol oluşturmak basit yolu. Örneğin, 64 bitlik bir makinedeki anahtar şunlara yüklenir: computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 PythonDir anahtarı ve ilişkili Path değeri ile

Ama cevap @ blah238 seviyorum. Programınızdan bir istem açın ve orada çalıştırın. Bunun işe yaramamasının bir nedenini göremiyorum.


2
Bu yaklaşım da kusurludur çünkü birden fazla Python kurulumu olabilir ve ArcGIS tarafından hangisinin kullanıldığını programlı olarak belirlemenin basit bir yolu yoktur. Arcpy çalıştırmıyorsanız bu önemli olmayabilir. Yine de, en sağlam çözümün kayıt defterini ve biraz mantığı içereceğini düşünüyorum. Yine de oraya gitmeyeceğim.
blah238

Mantık en yeni 2.7 sürümü ile başlamalı ve geriye doğru çalışmalıdır. Python'un yeni bir sürümünü yükledikten sonra daha sonra Python'un daha eski bir sürümünü yükleyecek eski bir ArcGIS sürümünü yüklediyseniz bu başarısız olabilir. Bu yüzden evet, bu potansiyeli kabul ediyorum, ama bu muhtemel değil (ya da sadece% 100 emin olmak için arc10.1 = py2.7, arc10.0 = py26 ... vb. Dediğim gibi, en iyi yöntem muhtemelen komut istemine çıkmaktır.
KHibma

@KHibma Kayıt defterini aradım. Ama "PYTHON" anahtarına bakmam gerçekten rahatsız edici. Makinemde yüklü iki python sürümü var ve her ikisini de döndürüyor. Bence, iyi bir fikir "ESRI" anahtarını bakmak ve gerçek değeri olan bir "Python" alt anahtarı varsa, o zaman "PythonDir" alt anahtar değerini alabilir. Benim durumumda çalışır :)
Emi

Bu kayıt defterinde "ESRI" anahtarı ile python yolu aramak için yanlış bir yol mu? Ya da esri'nin kayıt defterinde anahtarlar ve değerler oluşturmak için kullandığı yol değişebilir ve kod belki de okuyamaz
Emi

Kayıt defterinde "ara" dediğimde, yukarıda verdiğim gerçek yolları kullanıyorum. Birisi daha iyi bilmediği sürece, bu reg anahtarlarının konumu (kayıt defterinde) makineden makineye değişmez. Yani anahtarların orada olup olmadığını görmek için yolları
kodlarsınız

5

[Düzenle]set Programlı yürütme (dışarı vurdu, aşağıda) istediğimi yaptı, daha kolay ve daha temiz kod ile Environment.GetEnvironmentVariables () kullanılarak yapılabilir .

Bir seçenek sistemdeki her Ortam Değişkeni'ni taramak ve aşağıdakileri kanıtlamaya çalışmak olacaktır:

1) Ortam Değişkeni değeri bir dizin mi? (ve öyle olsa bile..)

2) Bu dizin içeriyor python.exemu?

Bunu, .Net Process API'sı aracılığıyla komutu yürüterekset programlı bir şekilde yapabildim . Bir parametre olmadan kullanıldığında komut, sistem tarafından kullanılıyor TÜM Ortam değişkenleri döndürür. Bu yüzden parazit yapabilir, daha sonra yayılan STDOUT sonuçlarını düzenleyebilir ve sonuçta sistem ortamı aracılığıyla mevcut olan herhangi bir şeyin (ve HERHANGİ demek istedim ) olup olmadığını görmek için bunları tarayabilirim .setsetpython.exe

Gönderen bu sayfayı tartışan setkomutu:

Geçerli tüm ortam değişkenlerini görüntülemek için parametresiz SET yazın.

Göstermek için yukarıda tartıştığım şeyi yapan bir yöntem kombinasyonu (ve bir yardımcı sınıf ) yazdım. Bunlar optimize edilebilir ve bazı kurşun geçirmezlik (Try..Catch vb.) Kullanabilirler, ancak bilgisayarda HERHANGİ BİR Ortam Değişkeni işaret ediyorsa python.exe, bu yaklaşım bunu bulmalıdır! Ben var denir , ya da her neyse .. umurumda değil PATH, ABBRACADABBRAeğer işaret python.exe, bu bulmak gerekir.

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

Burada terms, ortam değişkeninin adında veya ndeğerlerinde (yani PATHbirkaç değere sahip olabilir, ancak diğer değişkenlerin çoğunda yalnızca bir tane olacaktır) aramak için rutine ilettiğiniz bir dizi dizisi bulunur . Tüm dizelerin termsÜST OLDUĞUNDAN emin olun !

(Bunu test ettiğimde, basitçe C:\Python27\python.exeev sistemimde bulunan "PYTHON" u kullandım . Ancak, python.exegeri dönen herhangi bir adayın yolunu daha fazla incelemek isterseniz, başka bir terim dizesi [] içerecek şekilde kolayca genişletebilirsiniz . örneğin, ArcGIS bölmesinde olup olmadığını görmek için)

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

Ve ana sınıfımın altına aşağıdaki Yardımcı Sınıfı dahil ettim :

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

    public string key;
    public string[] values;
}

1
Bu, kullanıcı ArcGIS Desktop yükleyicisindeki Python kurulum dizinini özelleştirebileceğinden hassastır. Ayrıca PYTHONPATHdeğişken istediğiniz DEĞİLDİR.
blah238

@ blah238, bazen sahip olduğun tek şey kırılgan. Arc'ın PYTHONPATH'a karşı bağlandığını görünce gerçekten şaşırdım. Bu varsayılan bir 9.2 kurulumudur. Yine de, OP programlı olarak ArcGIS python.exe'ye nasıl ulaşacağını sordu ve bunu önerdiğim, kırılgan ya da kırılmayan yaklaşım bunu yapıyor.
elrobis

Aşağı oyu anladığımı söyleyemem, bu cevap gerçekten " yararlı değil " mi? O olmayabilir müthiş , ama muhtemelen yüklemek tipik Arc için çalışacak, kesinlikle bir seçenek ve en azından, bu konuya yardımcı bir şey ekler - açık belirtmek gerekirse, Arc de piton bağlamak için gözle yüklemek varsayılan göstermektedir. dışında bir Ortam Değişkeni olan exe PATH.
elrobis

Üzgünüm ama yanılıyorsunuz. PYTHONPATH değişkeni, Python tarafından bulmak için ArcGIS tarafından değil, modülleri bulmak için Python tarafından kullanılır. Bağlantıyı kontrol edin.
blah238

@ blah238, ekran görüntüsünün yapmaya çalıştığım noktayı ezdiğini / gizlediğini düşünüyorum. (Özellikle, OP'ye önerim vurgulamak istemiyordu PYTHONPATH, bu sadece o sisteme geri dönen tek değişken oldu python.exe.) Her neyse, cevabımı çalışan bir C # kod örneği dahil etmek için elden geçirdim ve takdir ediyorum hala bu yaklaşıma katılmıyorsanız. Teşekkürler / E.
elrobis

4

Yukarıdaki sorudaki yorumuma dayanarak alternatif bir çözüm sunmak istiyorum. Mevcut bir proje için çok benzer bir şey yapıyorum; Kullanıcı ArcMap kullanıcı arabiriminde bir düğmeyi tıklattığında, bir Python komut dosyası çalıştıran bir .NET eklentisi var. Bir PATH ortam değişkeni ArcGIS Python çalıştırılabilir bir gereksinim ayarlanmış olması, bu şekilde gerçekten benim Python exe yolu benim .NET kod dahil konusunda endişelenmenize gerek yok.

Şimdi, geliştirme aşamasındayken testçiler PATH değişkenini manuel olarak kuruyorlar. Ama sonunda Eklentiyi yükleyecek, Python bağımlılıklarını yükleyecek ve gerekli PATH değişkenlerini ayarlayacak bir Windows yükleyicisi (exe) oluşturulacak. Bunun için, Windows yükleyicileri oluşturmak için açık kaynaklı bir sistem olan Nullsoft Komut Dosyası Yükleme Sistemi'ni (NSIS) kullanıyorum . İşte şimdiye kadar çalıştım bazı kod, hangi oldukça kaba. Temel olarak, ilgili PATH değişkenlerinin orada olup olmadığını görmek için kayıt defterine bakar ve eğer değilse onları ekler. Tabii ki yönetici olarak çalıştırılmalıdır.

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

Yani, yine, bu ArcGIS Python exe'nin yolunu bulamaz, ancak son kullanıcınıza düzgün ve kolay bir şekilde ayarlama gücü vermenizi sağlar.


+1 Bu öneriye tamamen katılıyorum --- yüksek seviyede Çad "Arc'ın python örneğini çıkarmak için sorunu geriye doğru çalışma, bunun yerine bir yükleyici kullan ve doğru pitonu kurmak için SysAdmin'e bırak örneği." @ChadCooper, NSIS, seçerseniz bu varsayılan yolları geçersiz kılabilmeniz için size herhangi bir UI kontrolü sağlıyor mu? Kodun bunu ima ettiğini görmüyorum ama bahse girerim orada.
elrobis

@elrobis - Varolanları geçersiz kılabilir / düzenleyebilir / değiştirebilirsin - NSIS çok yapılandırılabilir ve oldukça kaygan bir yükleyici oluşturmana izin verebilir - yazmak için kodu bulmalısın.
Chad Cooper

Bir eklenti için bir yükleyici oluşturmak biraz çılgınca görünüyor. Ayrıca, 10.1, 10.2 vb. Ve 10.0'ı desteklemek için hangi değişiklikleri yapmanız gerekir?
blah238

@ blah238 - evet, çılgınca gözüküyor, ancak bu proje için kurucum, konuştuğumuz gibi çok daha fazlasını yapacak. Eklentim kesinlikle 10.0 için. Sanırım ArcGIS'in farklı sürümleri için, hangi sürümün yüklü olduğunu görmek için kayıt defterini kontrol edebilir, ardından buna göre hareket edebilirsiniz.
Chad Cooper
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.