¿Cómo puedo obtener programáticamente la ruta de "Python.exe" utilizada por ArcMap


16

Estoy trabajando con un complemento de ArcMap en C #. Desde el código C #, he ejecutado algunos scripts de Python. Ahora, para ejecutar ese script, tengo una ruta de python codificada. Pero esto no es portátil. Entonces, quiero obtener la ruta del ejecutable de Python desde el código y usarlo.

Pregunta:

¿Cómo puedo obtener la ruta del ejecutable Python utilizado por ArcMap desde el código C #?

EDITAR:

A partir de sus sugerencias, por ahora estoy usando "entorno de ruta" para obtener la ruta de 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;
        }
    }
}

Pero hay un problema:

Cuando se instala una versión diferente de python en mi máquina, no hay garantía de que, el "python.exe" que estoy usando, ArcGIS también lo esté usando.

No aprecio usar otra herramienta para obtener la ruta "python.exe" . Entonces, realmente pienso si hay alguna forma de obtener la ruta de la clave de registro. Para el registro "ArcGIS10.0" se ve así: ingrese la descripción de la imagen aquí

Y para eso, estoy pensando en seguir la siguiente manera de obtener el camino:

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

Pero antes de usar el segundo procedimiento, necesito estar seguro de mis conjeturas. Las conjeturas son:

  1. el "Verdadero" asociado con Python significa que Python está instalado con ArcGIS
  2. ArcGIS 10.0 y la clave de registro de la versión superior se escribirán en el mismo proceso.

Por favor, ayúdame a obtener alguna aclaración sobre mis conjeturas.



33
¿No puede simplemente tener una variable de entorno PATH establecida en ArcGIS Python exe como un requisito de instalación para su complemento?
Chad Cooper

Todo dicho, el pensamiento de @ ChadCooper tiene que ser la mejor manera. En lugar de intentar trabajar al revés, solo configúrelo de una vez por todas en el momento de la instalación.
elrobis

@elrobis: Lo sé, establecer el camino en el entorno PATH es una buena manera. Pero quería saber si hay alguna forma de encontrar la python y hacer todo sin interrumpir al usuario.
Emi

@ blah238 gracias por su sugerencia. Nunca trabajé con la herramienta de script. Tal vez necesito aprender al respecto
Emi

Respuestas:


2

Tomé su segundo ejemplo de código, lo hice funcionar en sistemas operativos de 64 y 32 bits, y lo simplifiqué un poco. Funciona para mí en 10.1 en Windows 7 de 64 bits, pero obviamente debe probarlo en tantos entornos como sea posible y agregar de nuevo en las comprobaciones de programación defensiva que considere necesarias.

Después de probar la instalación limpia de ArcGIS Desktop 10.1 sin Python, descubrí que no incluye la subclave Python10.x, y mucho menos el valor Verdadero / Falso "Python" (aún no estoy seguro de para qué sirve, tal vez contacte al soporte de ESRI si debe saber).

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

En una máquina Desktop 10.1 con Python, esto vuelve C:\Python27\ArcGIS10.1\python.exe. En una máquina Desktop 10.1 sin Python, esto genera una InvalidOperationException debido a que la clave Python10.x no está presente.

Espero que esto te ayude con lo que sea que estés tratando de lograr, lo que, sorprendentemente, todavía no está claro para mí.


7

En lugar de buscar el ejecutable de Python, este tema de ayuda sugiere el lanzamiento cmd.exey la ejecución python.exesin calificar su ubicación. Sin embargo, tenga en cuenta que esto debería funcionar porque el instalador de ArcGIS Desktop se configura (editar: probado recientemente en 10.1, no lo hace) depende de la ruta para python.exeagregarse a la PATHvariable de entorno del usuario .

Otro enfoque es crear una herramienta de secuencia de comandos y ejecutarla desde ArcObjects .

Si realmente está python.exesiguiendo la ruta a la versión de ArcGIS de , por extensión del enfoque de la herramienta de script ArcObjects +, puede crear una herramienta de script Python cuyo único resultado sea el valor de sys.exec_prefix. Esta es la ruta de la carpeta que contiene la versión de Python de ArcGIS, por ejemplo C:\Python27\ArcGIS10.1.

Nota al margen : sys.executabledevuelve la ruta ArcMap.exeay NO python.execuando se ejecuta en proceso, por lo que no sugiero usar esa variable.

Llame a la herramienta de script desde ArcObjects y obtenga el resultado del IGeoProcessorResultobjeto devuelto .

Actualización: Aquí hay un proyecto de complemento de ArcMap de muestra (VS2010, .NET 3.5) que utiliza una herramienta de script empaquetada dentro del complemento que simplemente muestra la ruta de acceso python.exeutilizada por ArcMap: http://wfurl.com/cbd5091

Es solo un botón en el que haces clic y aparece un cuadro de mensaje con la ruta:

Botón Buzon de mensaje

Los bits de código interesantes:

  • Script de 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)
  • Función 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
Pero este documento no dice eso, el instalador de ArcGIS Desktop configura la ruta a python.exe a la variable de entorno PATH del usuario. Por lo tanto, puede ser posible que la ruta de Python no se encuentre en la variable de entorno PATH. Entonces creará un error. Entonces, ¿cómo puedo estar seguro de que la ruta ejecutable de Python está en la variable de entorno PATH del usuario?
Emi

2
No puede, como la mayoría de las cosas en la vida y la computación, todo lo que puede hacer es hacer suposiciones y esperar que las cosas funcionen, y tener un plan alternativo cuando no lo hacen (brinde instrucciones sobre cómo agregarlo a la variable de entorno PATH). Dicho esto, si se trata de una instalación normal, creo que el instalador de ArcGIS Desktop agrega esa ruta a la variable de entorno PATH.
blah238

2
He visto muchas instalaciones donde el python instalado por arcgis no estaba en la ruta. ¿Y qué pasa si hay dos versiones instaladas y la 'incorrecta' está en el camino?
blindjesse

Ofrecí una solución en mi tercer párrafo que debería encontrar la instalación de Python de ArcGIS independientemente de la PATHvariable de entorno.
blah238

@ blah238 ¿la creación de la herramienta de script no hace que mi complemento sea menos portátil o dificulta el proceso de instalación del complemento en la máquina de otros?
Emi

6

¿Tendrá acceso al registro?

Al instalar ArcMap, instalará Python si no puede encontrarlo. Se ve en el registro para ver si Python ya está instalado. Creo que la ubicación de registro estándar para esto es: computadora \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath con una clave predeterminada de la ubicación de la ruta (2.7 es 10.1, 2.6 es 10.0)

No puedo pensar en una razón cuando / por qué el valor de esta clave sería incorrecto, pero siempre podría ir de esta manera: dentro de la sección Esri \ Desktop del registro hay una ubicación de Python. Es la ruta simple que puede obtener y luego construir otras rutas para asegurarse de que hay un Python.exe. Por ejemplo, la clave en una máquina de 64 bits se instala en: computadora \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 Con una clave PythonDir y el valor de ruta asociado

Pero me gusta la respuesta @ blah238. Simplemente abra un mensaje de su programa y ejecútelo allí. No puedo ver una razón por la cual esto no funcionaría.


2
Este enfoque también es defectuoso porque podría haber múltiples instalaciones de Python y no tiene una forma directa de determinar mediante programación cuál es la utilizada por ArcGIS. Sin embargo, si no está ejecutando arcpy, esto podría no importar. Aún así, creo que la solución más robusta implicaría el registro y bastante lógica. Sin embargo, no voy a ir allí.
blah238

Bueno, la lógica tendría que comenzar con la última versión 2.7 y trabajar hacia atrás. Por supuesto, esto podría fallar si instaló una nueva versión de Python, luego fue e instaló una versión anterior de ArcGIS que instalaría una versión anterior de Python. Entonces, sí, estoy de acuerdo en que existe este potencial, pero no es probable (o podría simplemente construir una búsqueda de arc10.1 = py2.7, arc10.0 = py26 ... etc. para estar 100% seguro). Como dije, el mejor método probablemente sería simplemente ejecutar el símbolo del sistema.
KHibma

@KHibma Busqué en el registro. Pero creo que es realmente molesto si miro a través de la tecla "PYTHON". En mi máquina, hay dos versiones de Python instaladas y devuelve ambas. Creo que es una buena idea mirar a través de la tecla "ESRI" y si hay una subclave "Python" con valor verdadero, entonces puedo tomar el valor de la subclave "PythonDir". Funciona en mi caso :)
Emi

¿Es esta una forma incorrecta de buscar la ruta de Python en el registro a través de la clave "ESRI"? ¿O hay alguna posibilidad de que, la forma en que esri utiliza para crear claves y valores en el registro se pueda cambiar y el código tal vez no pueda leerlo
Emi

Cuando digo "buscar" en el registro, me refiero a usar las rutas reales que proporcioné anteriormente. A menos que alguien sepa mejor, la ubicación de estas claves de registro (en el registro) no cambiaría de una máquina a otra. Así que simplemente codificarías los caminos para ver si las claves existen allí, si es así, ¿cuál es el valor ...
KHibma

5

[Editar] Mientras que la ejecución setprogramática (tachada, a continuación) hizo lo que quería, se puede lograr más fácilmente y con un código más limpio usando Environment.GetEnvironmentVariables () .

Una opción sería escanear todas las Variables de entorno en el sistema e intentar probar lo siguiente:

1) ¿El valor de la variable de entorno es un directorio? (y de ser así..)

2) ¿Contiene ese directorio python.exe?

Pude hacer esto mediante programación ejecutando el setcomando a través de la API de proceso .Net . El setcomando, cuando se usa sin un parámetro, devuelve TODAS las variables de entorno en uso por el sistema. Por lo tanto, podría parasear, luego organizar los resultados STDOUT emitidos sety examinarlos para ver si algo (y quiero decir CUALQUIER COSA ) disponible a través del entorno del sistema finalmente señaló python.exe.

Desde esta página discutiendo el setcomando:

Escriba SET sin parámetros para mostrar todas las variables de entorno actuales.

Para ilustrar, escribí una combinación de métodos (y una clase auxiliar ) que hace lo que discutí anteriormente. Estos pueden optimizarse, y podrían usar algo de prueba de balas (Try..Catch, etc.), pero si la computadora tiene CUALQUIER variable de entorno apuntando python.exe, ¡este enfoque debería encontrarla! No me importa si el var se llama PATH, ABBRACADABBRAo lo que sea .. si apunta a python.exe, esto debe encontrarlo.

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

Aquí termshay una matriz de cadenas que pasa a la rutina para buscar en el nombre de la variable de entorno o en sus nvalores (es decir, PATHpuede tener varios valores, pero la mayoría de los otros vars tendrán solo uno). ¡Asegúrese de que todas las cuerdas termsestén en MAYÚSCULAS!

(Cuando probé esto, usé simplemente "PYTHON", que se encuentra C:\Python27\python.exeen mi sistema doméstico. Pero podría extenderlo fácilmente para incluir otra cadena [] de términos si quisiera inspeccionar aún más la ruta de los python.execandidatos devueltos --- para ejemplo, para ver si estaban en el contenedor ArcGIS, etc.)

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

Y al final de mi clase principal, incluí la siguiente clase auxiliar :

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

    public string key;
    public string[] values;
}

1
Esto es frágil, ya que el usuario puede personalizar el directorio de instalación de Python en el instalador de ArcGIS Desktop. Además, la PYTHONPATHvariable NO es la que deseas.
blah238

@ blah238, a veces frágil es todo lo que tienes. De hecho, me sorprendió ver que Arc estaba conectado contra PYTHONPATH. Esa es una instalación predeterminada de 9.2. Sin embargo, el OP preguntó cómo llegar programáticamente a ArcGIS python.exe, y el enfoque que recomendé, frágil o no, lo hace.
elrobis

No puedo decir que entiendo el voto negativo, ¿es esta respuesta realmente " no útil "? Puede que no sea increíble , pero sin duda es una opción, probablemente funcionaría para una instalación típica de Arc y, al menos, agrega algo útil al hilo: específicamente, ilustra una instalación de Arc predeterminada que opta por vincular su python. exe con una variable de entorno que no sea PATH.
elrobis

Lo siento pero eres incorrecto. Python utiliza la variable PYTHONPATH para buscar módulos, no ArcGIS para encontrar Python. Mira el enlace.
blah238

@ blah238, creo que la captura de pantalla fue abrumadora / oscureció el punto que estaba tratando de hacer. (Específicamente, mi sugerencia al OP no tenía la intención de enfatizar PYTHONPATH, sino que era la única variable en ese sistema en particular que apuntaba hacia atrás python.exe). De todos modos, revisé mi respuesta para incluir un ejemplo de código C # que funcione, y agradecería sabiendo si aún no estás de acuerdo con este enfoque. Gracias / E
elrobis

4

Me gustaría ofrecer una solución alternativa, basada en mi comentario en la pregunta anterior. Para un proyecto actual, estoy haciendo algo muy similar; Tengo un complemento .NET que, cuando el usuario hace clic en un botón en la interfaz de usuario de ArcMap, se ejecuta un script de Python. Hice que tener una variable de entorno PATH establecida en el ejecutable de ArcGIS Python sea un requisito, de esa manera no tengo que preocuparme por incluir la ruta al exe de Python en mi código .NET.

Ahora, mientras están en desarrollo, los probadores solo están configurando la variable PATH manualmente. Pero eventualmente tendré un instalador de Windows (exe) creado que instalará el complemento, instalará las dependencias de Python y establecerá las variables PATH necesarias. Para esto, estoy usando el Sistema de instalación de secuencias de comandos de Nullsoft (NSIS) , un sistema de código abierto para crear instaladores de Windows. Aquí hay un código que he trabajado hasta ahora, que es bastante tosco. Básicamente, se ve en el registro para ver si las variables PATH de interés están allí, y si no lo están, las agrega. Tiene que ejecutarse como administrador, por supuesto.

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

Entonces, nuevamente, esto no encuentra la ruta al ArcGIS Python exe, pero le permite dar a su usuario final el poder de configurarlo de manera adecuada y fácil.


+1 Estoy completamente de acuerdo con esta recomendación --- donde en el nivel superior, Chad dice "no trabaje el problema al revés para deducir la instancia de Python de Arc, más bien use un instalador y déjelo al SysAdmin para establecer la python correcta ejemplo." @ChadCooper, ¿NSIS le da algún control de UI para que pueda anular esas rutas predeterminadas si lo desea? No veo eso implícito en el código, pero apuesto a que está allí.
elrobis

@elrobis: apuesto a que puede anular / editar / cambiar los existentes: NSIS es muy configurable y puede permitirle crear un instalador bastante ingenioso, solo tiene que descubrir el código para escribirlo.
Chad Cooper

Crear un instalador para un complemento simplemente parece un poco loco. Además, ¿qué modificaciones necesitaría hacer para admitir 10.1, 10.2, etc., así como 10.0?
blah238

@ blah238: sí, parece una locura, pero mi instalador para este proyecto en particular hará mucho más, como se mencionó. Mi complemento es estrictamente para 10.0. Supongo que para diferentes versiones de ArcGIS, puede consultar el registro para ver qué versión está instalada, y luego actuar en consecuencia.
Chad Cooper
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.