Bagaimana saya bisa secara program mendapatkan jalur "Python.exe" yang digunakan oleh ArcMap

16

Saya bekerja dengan add-in dari ArcMap di C #. Dari kode C #, saya telah menjalankan beberapa skrip Python. Sekarang, untuk menjalankan skrip itu, saya memiliki jalur python hard-coded. Tapi ini tidak portabel. Jadi, saya ingin mendapatkan jalur dari Python yang dapat dieksekusi dari kode dan menggunakannya.

Pertanyaan:

Bagaimana saya bisa mendapatkan path dari executable Python yang digunakan oleh ArcMap dari kode C #?

EDIT:

Dari saran Anda, untuk saat ini saya menggunakan "jalur lingkungan" untuk mendapatkan jalur 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;
        }
    }
}

Tapi ada masalah:

Ketika versi berbeda dari python diinstal di mesin saya, tidak ada jaminan bahwa, "python.exe" yang saya gunakan, ArcGIS juga menggunakan itu.

Saya tidak menghargai menggunakan alat lain untuk mendapatkan jalur "python.exe" . Jadi, saya benar-benar berpikir jika ada cara untuk mendapatkan jalur dari kunci registri. Untuk registri "ArcGIS10.0" terlihat seperti: masukkan deskripsi gambar di sini

Dan untuk itu, saya berpikir tentang cara berikut untuk mendapatkan jalan:

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

Tetapi sebelum menggunakan prosedur kedua, saya harus yakin tentang dugaan saya. Tebakannya adalah:

  1. "True" yang terkait dengan python berarti python diinstal dengan ArcGIS
  2. ArcGIS 10.0 dan kunci registri versi atas akan ditulis dalam proses yang sama.

Tolong bantu saya untuk mendapatkan klarifikasi tentang tebakan saya.

Emi
sumber
5
Sudahkah Anda mempertimbangkan untuk membuat alat skrip dan menjalankannya dari ArcObjects ?
blah238
3
Bisakah Anda tidak hanya memiliki variabel lingkungan PATH yang diatur ke ArcGIS Python exe menjadi persyaratan instalasi untuk Add-In Anda?
Chad Cooper
Semua berkata, pemikiran @ ChadCooper harus menjadi cara terbaik. Daripada mencoba untuk bekerja mundur, cukup atur sekali dan untuk semua pada saat instalasi.
Elrobis
@elrobis: Saya tahu, mengatur jalur di lingkungan PATH adalah cara yang baik. Tapi saya ingin tahu apakah ada cara untuk menemukan python dan melakukan segalanya tanpa mengganggu pengguna.
Emi
@ blah238 terima kasih atas saran Anda. Saya tidak pernah bekerja dengan alat skrip. Mungkin saya perlu mempelajarinya
Emi

Jawaban:

2

Saya mengambil contoh kode kedua Anda, membuatnya bekerja pada OS 64 dan 32-bit, dan menyederhanakannya sedikit. Bekerja untuk saya di 10.1 pada Windows 7 64-bit, tetapi jelas Anda harus mengujinya di lingkungan sebanyak mungkin, dan menambahkan kembali dalam pemeriksaan pemrograman defensif apa pun yang Anda anggap perlu.

Setelah menguji bersih-menginstal ArcGIS Desktop 10.1 tanpa Python, saya menemukan bahwa itu tidak termasuk subkey Python10.x, apalagi nilai "Python" Benar / Salah (masih tidak yakin untuk apa itu, mungkin hubungi dukungan ESRI jika Anda harus tahu).

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

Pada mesin Desktop 10.1 dengan Python, ini kembali C:\Python27\ArcGIS10.1\python.exe. Pada mesin Desktop 10.1 tanpa Python, ini memunculkan InvalidOperationException karena kunci Python10.x tidak ada.

Semoga ini membantu Anda dengan apa pun yang ingin Anda capai, yang - luar biasa - masih belum jelas bagi saya.

blah238
sumber
7

Alih-alih mencari Python yang dapat dieksekusi, topik bantuan ini menyarankan keluar cmd.exedan berjalan python.exetanpa memenuhi syarat lokasinya. Namun perlu dicatat, ini harus berhasil karena penginstal ArcGIS Desktop mengatur (edit: baru-baru ini diuji pada 10.1, tidak) bergantung pada jalur yang python.exeakan ditambahkan ke PATHvariabel lingkungan pengguna .

Pendekatan lain adalah membuat alat skrip dan menjalankannya dari ArcObjects .

Jika Anda benar-benar mengikuti jalur ke versi ArcGIS python.exe, dengan perluasan pendekatan alat skrip ArcObjects +, Anda bisa membuat alat skrip Python yang hanya menghasilkan output nilai sys.exec_prefix. Ini adalah path folder yang berisi versi Python ArcGIS, misalnya C:\Python27\ArcGIS10.1.

Catatan samping : sys.executablemengembalikan jalur ke ArcMap.exedan BUKAN python.exesaat dijalankan dalam proses, itulah sebabnya saya tidak menyarankan menggunakan variabel itu.

Panggil alat skrip dari ArcObjects dan dapatkan output dari IGeoProcessorResultobjek yang dikembalikan .

Pembaruan: Berikut adalah contoh proyek tambahan ArcMap (VS2010, .NET 3.5) yang menggunakan alat skrip yang dikemas dalam add-in yang hanya menampilkan jalur ke yang python.exedigunakan oleh ArcMap: http://wfurl.com/cbd5091

Ini hanya tombol yang Anda klik dan muncul kotak pesan dengan path:

Tombol Kotak pesan

Bit kode yang menarik:

  • Skrip 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)
  • Fungsi 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
sumber
2
Tetapi dokumen ini tidak mengatakan itu, ArcGIS Desktop installer menetapkan path ke python.exe ke variabel lingkungan PATH pengguna. Jadi bisa saja jalur python tidak ada dalam variabel lingkungan PATH. Maka itu akan membuat kesalahan. Jadi, bagaimana saya bisa yakin bahwa jalur executable python ada dalam variabel lingkungan PATH pengguna.
Emi
2
Anda tidak bisa, seperti kebanyakan hal dalam kehidupan dan komputasi yang dapat Anda lakukan adalah membuat asumsi dan berharap semuanya berfungsi, dan memiliki rencana mundur ketika tidak ada (berikan instruksi tentang menambahkannya ke variabel lingkungan PATH). Yang mengatakan, jika ini adalah instalasi normal, saya percaya installer ArcGIS Desktop menambahkan path itu ke variabel lingkungan PATH.
blah238
2
Saya telah melihat banyak instalasi di mana python arcgis-install tidak ada di jalur. Dan bagaimana jika ada dua versi yang diinstal dan yang 'salah' ada di jalurnya?
blindjesse
Saya menawarkan solusi dalam paragraf ke-3 saya yang seharusnya menemukan instalasi ArcGIS tentang Python terlepas dari PATHvariabel lingkungan.
blah238
@ blah238 tidak membuat alat skrip membuat add-in saya lebih mudah dibawa-bawa atau mempersulit proses pemasangan add-in ke mesin orang lain?
Emi
6

Apakah Anda memiliki akses ke registri?

Ketika menginstal ArcMap, itu akan menginstal Python jika tidak dapat menemukannya. Itu terlihat di registri untuk melihat apakah Python sudah diinstal. Saya percaya lokasi registri standar untuk ini adalah: computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath Dengan Kunci default dari lokasi Path (2.7 menjadi 10.1, 2.6 menjadi 10.0)

Saya tidak bisa memikirkan alasan kapan / mengapa nilai kunci ini salah, tetapi Anda selalu bisa seperti ini: Di ​​dalam kumpulan Esri \ Desktop registri adalah lokasi Python. Ini adalah jalur sederhana yang bisa Anda dapatkan dan kemudian membangun jalur lebih lanjut untuk memastikan ada Python.exe. Sebagai contoh, kunci pada mesin 64bit diinstal ke: computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 Dengan kunci PythonDir dan nilai Path yang terkait

Tapi saya suka jawaban @ blah238. Cukup buka prompt dari program Anda dan jalankan di sana. Saya tidak dapat melihat alasan mengapa ini tidak berhasil.

KHibma
sumber
2
Pendekatan ini juga cacat karena mungkin ada beberapa instalasi Python dan Anda tidak memiliki cara langsung untuk menentukan program mana yang merupakan yang digunakan oleh ArcGIS. Jika Anda tidak menjalankan arcpy, ini mungkin tidak masalah. Meski begitu, saya pikir solusi yang paling kuat akan melibatkan registri dan sedikit logika. Saya tidak akan pergi ke sana.
blah238
Logikanya harus dimulai dengan versi terbaru 2.7 dan bekerja mundur. Ini tentu saja bisa gagal jika Anda menginstal versi Python baru, lalu pergi dan menginstal versi ArcGIS yang lebih lama yang akan menginstal versi Python yang lebih lama. Jadi ya, saya setuju ada potensi ini, tetapi itu tidak mungkin (atau Anda bisa membangun lookup dari arc10.1 = py2.7, arc10.0 = py26 ... dll menjadi 100% yakin). Seperti yang saya katakan, metode terbaik mungkin hanya untuk keluar ke command prompt.
KHibma
@ KHibma saya mencari melalui registri. Tapi saya pikir itu sangat merepotkan jika saya melihat kunci "PYTHON". Di mesin saya, ada dua versi python yang diinstal dan mengembalikan keduanya. Saya pikir, itu ide yang bagus untuk melihat kunci "ESRI" dan jika ada subkey "Python" dengan nilai sebenarnya, maka saya dapat mengambil nilai subkey "PythonDir". Ini berfungsi dalam kasus saya :)
Emi
Apakah ini cara yang salah untuk mencari jalur python di registri melalui kunci "ESRI"? Atau adakah kemungkinan itu, cara esri menggunakan untuk membuat kunci dan nilai-nilai dalam registri dapat diubah dan kode mungkin tidak dapat membacanya
Emi
Ketika saya mengatakan "cari" registri, maksud saya gunakan jalur sebenarnya yang saya berikan di atas. Kecuali ada yang tahu, lokasi kunci reg ini (dalam registri) tidak akan berubah dari mesin ke mesin. Jadi Anda hanya perlu membuat hardcode jalur untuk melihat apakah kunci ada di sana, jika demikian whats the value ...
KHibma
5

[Sunting] Saat menjalankan secara setprogram (muncul, di bawah) melakukan apa yang saya inginkan, itu dapat diselesaikan dengan lebih mudah dan dengan kode yang lebih bersih menggunakan Environment.GetEnvironmentVariables () .

Salah satu opsi adalah memindai setiap Variabel Lingkungan pada sistem dan berusaha membuktikan yang berikut:

1) Apakah nilai Variabel Lingkungan merupakan direktori? (dan jika demikian..)

2) Apakah direktori itu mengandung python.exe?

Saya dapat melakukan ini secara terprogram dengan mengeksekusi setperintah melalui. Net Process API . The setperintah, bila digunakan tanpa parameter, mengembalikan SEMUA Variabel Lingkungan digunakan oleh sistem. Jadi saya bisa membuat parase, kemudian mengatur hasil STDOUT yang dipancarkan set, dan menyaringnya untuk melihat apakah ada sesuatu (dan maksud saya APA SAJA ) yang tersedia melalui sistem lingkungan yang pada akhirnya ditunjukkan python.exe.

Dari halaman ini membahas setperintah:

Ketik SET tanpa parameter untuk menampilkan semua variabel lingkungan saat ini.

Sebagai ilustrasi saya menulis kombinasi metode (dan kelas pembantu ) yang melakukan apa yang saya bahas di atas. Ini dapat dioptimalkan, dan mereka dapat menggunakan beberapa pemeriksaan-peluru (Coba..Catch, dll), tetapi jika komputer memiliki APAPUN Variabel Lingkungan APAPUN menunjuk ke python.exe, pendekatan ini harus menemukannya! Saya tidak peduli jika var disebut PATH, ABBRACADABBRA, atau apa pun .. jika menunjuk ke python.exe, ini harus menemukannya.

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

Berikut termsini adalah array string yang Anda berikan pada rutinitas untuk mencari nama variabel lingkungan, atau nnilainya (yaitu PATHdapat memiliki beberapa nilai, tetapi sebagian besar vars lainnya hanya memiliki satu). Pastikan semua string dalam termsUPPERCASE!

(Ketika saya menguji ini, saya hanya menggunakan "PYTHON", yang ditemukan C:\Python27\python.exepada sistem rumah saya. Tetapi Anda dapat dengan mudah memperluasnya untuk memasukkan string [] istilah lain jika Anda ingin memeriksa lebih lanjut jalur python.exekandidat yang dikembalikan --- untuk contoh, untuk melihat apakah mereka berada di nampan ArcGIS, dll.)

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

Dan di bagian bawah kelas utama saya, saya menyertakan Kelas Penolong berikut :

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

    public string key;
    public string[] values;
}
elrobis
sumber
1
Ini rapuh, karena pengguna dapat menyesuaikan direktori instalasi Python di penginstal ArcGIS Desktop. Juga PYTHONPATHvariabel BUKAN yang Anda inginkan.
blah238
@ blah238, terkadang rapuh semua yang Anda punya. Saya benar-benar terkejut melihat bahwa Arc terhubung dengan PYTHONPATH. Itu adalah instalasi standar 9.2. Namun demikian, OP bertanya bagaimana secara pemrograman mendapatkan ke python.exe ArcGIS, dan pendekatan yang saya sarankan, rapuh atau tidak, apakah itu.
elrobis
Tidak bisa mengatakan saya mengerti suara-down, apakah jawaban ini benar-benar " tidak berguna "? Ini mungkin tidak luar biasa , tapi itu tentu saja sebuah pilihan, mungkin akan bekerja untuk instalasi Arc yang khas, dan paling tidak, ia menambahkan sesuatu yang bermanfaat untuk utas - khususnya, ini menggambarkan instalasi Arc default yang memilih untuk menautkan python-nya. exe dengan Variabel Lingkungan selain PATH.
elrobis
Maaf, tetapi Anda salah. Variabel PYTHONPATH digunakan oleh Python untuk menemukan modul, bukan oleh ArcGIS untuk menemukan Python. Periksa tautannya.
blah238
@ blah238, saya pikir tangkapan layarnya luar biasa / mengaburkan poin yang saya coba buat. (Secara khusus, saran saya kepada OP tidak bermaksud untuk menekankan PYTHONPATH, yang kebetulan menjadi satu - satunya var pada sistem tertentu yang menunjuk kembali python.exe.) Bagaimanapun, saya merombak jawaban saya untuk memasukkan contoh kode C # yang berfungsi, dan saya akan sangat menghargai mengetahui apakah Anda masih tidak setuju dengan pendekatan ini. Terima kasih / e.
elrobis
4

Saya ingin menawarkan solusi alternatif, berdasarkan komentar saya dalam pertanyaan di atas. Untuk proyek saat ini, saya melakukan sesuatu yang sangat mirip; Saya memiliki .NET Add-In itu, ketika pengguna mengklik tombol di ArcMap UI, skrip Python berjalan. Saya membuat memiliki variabel lingkungan PATH diatur ke ArcGIS Python dieksekusi persyaratan, dengan cara itu saya tidak benar-benar perlu khawatir tentang memasukkan path ke exe Python dalam kode .NET saya.

Sekarang, sementara dalam pengembangan, penguji hanya mengatur variabel PATH secara manual. Tapi saya akhirnya akan memiliki installer Windows (exe) dibuat yang akan menginstal Add-In, menginstal dependensi Python, dan mengatur variabel PATH yang diperlukan. Untuk ini, saya menggunakan Nullsoft Scriptable Install System (NSIS) , sistem open source untuk membuat installer Windows. Berikut adalah beberapa kode yang telah saya upayakan sejauh ini, yang cukup kasar. Pada dasarnya, ini terlihat dalam registri untuk melihat apakah variabel-variabel PATH yang menarik ada di sana, dan jika mereka tidak menambahkannya. Harus dijalankan sebagai admin, tentu saja.

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

Jadi, sekali lagi, ini tidak menemukan jalan ke exe ArcGIS Python, tetapi ini memungkinkan Anda untuk memberi pengguna akhir Anda kekuatan untuk mengaturnya dengan benar dan mudah.

Chad Cooper
sumber
+1 Saya sepenuhnya setuju dengan rekomendasi ini --- di mana pada level tinggi, Chad mengatakan "jangan lakukan masalah mundur untuk menyimpulkan contoh python Arc, daripada menggunakan installer dan serahkan ke SysAdmin untuk membuat python yang benar contoh." @ChadCooper, apakah NSIS memberi Anda kontrol UI sehingga Anda dapat mengganti jalur default itu jika Anda memilih? Saya tidak melihat itu tersirat oleh kode tetapi saya yakin itu ada di sana.
Elrobis
@elrobis - Saya yakin Anda dapat mengganti / mengedit / mengubah yang sudah ada - NSIS sangat dapat dikonfigurasi dan dapat membuat Anda membangun installer yang cukup apik - Anda hanya perlu mencari tahu kode untuk menuliskannya.
Chad Cooper
Membuat installer untuk sebuah add-in sepertinya sedikit gila. Juga, modifikasi apa yang perlu Anda buat untuk mendukung 10.1, 10.2, dll. Serta 10.0?
blah238
@ blah238 - yeah, sepertinya gila, tapi installer saya untuk proyek khusus ini akan melakukan lebih banyak, seperti yang dibicarakan. Add-In saya hanya untuk 10.0. Saya kira untuk berbagai versi ArcGIS Anda dapat memeriksa registri untuk melihat versi apa yang diinstal, kemudian bertindak sesuai.
Chad Cooper