Sto lavorando con un componente aggiuntivo di ArcMap in C #. Dal codice C #, ho eseguito alcuni script Python. Ora, per eseguire quelle sceneggiature, ho un percorso python codificato. Ma questo non è portatile. Quindi, voglio ottenere il percorso dell'eseguibile Python dal codice e usarlo.
Domanda:
Come posso ottenere il percorso dell'eseguibile Python usato da ArcMap dal codice C #?
MODIFICARE :
Dai tuoi suggerimenti, per ora sto usando "path environment" per ottenere il percorso 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;
}
}
}
Ma c'è un problema:
Quando nella mia macchina è installata una versione diversa di python, non c'è alcuna garanzia che, il "python.exe" che sto usando, ArcGIS lo usi anche.
Non apprezzo l'uso di un altro strumento per ottenere il percorso "python.exe" . Quindi, penso davvero se esiste un modo per ottenere il percorso dalla chiave di registro. Per il registro "ArcGIS10.0" appare come:
E per questo, sto pensando di seguire il modo di ottenere il percorso:
//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 ;
}
Ma prima di utilizzare la seconda procedura, devo essere sicuro delle mie ipotesi. Le ipotesi sono:
- il "Vero" associato a Python significa che Python è installato con ArcGIS
- ArcGIS 10.0 e la chiave di registro della versione superiore verranno scritti nello stesso processo.
Ti prego, aiutami a ottenere qualsiasi chiarimento sulle mie ipotesi.