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.