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í:
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:
- el "Verdadero" asociado con Python significa que Python está instalado con ArcGIS
- 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.
fuente
Respuestas:
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).
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í.
fuente
En lugar de buscar el ejecutable de Python, este tema de ayuda sugiere el lanzamiento
cmd.exe
y la ejecuciónpython.exe
sin calificar su ubicación. Sin embargo,tenga encuenta que estodeberíafuncionar porque el instalador de ArcGIS Desktop se configura(editar: probado recientemente en 10.1, no lo hace) depende de la ruta parapython.exe
agregarse a laPATH
variable de entorno del usuario .Otro enfoque es crear una herramienta de secuencia de comandos y ejecutarla desde ArcObjects .
Si realmente está
python.exe
siguiendo 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 desys.exec_prefix
. Esta es la ruta de la carpeta que contiene la versión de Python de ArcGIS, por ejemploC:\Python27\ArcGIS10.1
.Nota al margen :
sys.executable
devuelve la rutaArcMap.exe
ay NOpython.exe
cuando 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
IGeoProcessorResult
objeto 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.exe
utilizada por ArcMap: http://wfurl.com/cbd5091Es solo un botón en el que haces clic y aparece un cuadro de mensaje con la ruta:
Los bits de código interesantes:
Script de Python:
Función C #:
fuente
PATH
variable de entorno.¿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.
fuente
[Editar] Mientras que la ejecución
set
programá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 elset
comando a través de la API de proceso .Net . Elset
comando, 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 emitidosset
y 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
set
comando: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 llamaPATH
,ABBRACADABBRA
o lo que sea .. si apunta apython.exe
, esto debe encontrarlo.Aquí
terms
hay una matriz de cadenas que pasa a la rutina para buscar en el nombre de la variable de entorno o en susn
valores (es decir,PATH
puede tener varios valores, pero la mayoría de los otros vars tendrán solo uno). ¡Asegúrese de que todas las cuerdasterms
estén en MAYÚSCULAS!(Cuando probé esto, usé simplemente "PYTHON", que se encuentra
C:\Python27\python.exe
en 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 lospython.exe
candidatos devueltos --- para ejemplo, para ver si estaban en el contenedor ArcGIS, etc.)Y al final de mi clase principal, incluí la siguiente clase auxiliar :
fuente
PYTHONPATH
variable NO es la que deseas.PATH
.PYTHONPATH
, sino que era la única variable en ese sistema en particular que apuntaba hacia atráspython.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 / EMe 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.
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.
fuente