Je travaille avec un complément d'ArcMap en C #. A partir du code C #, j'ai exécuté quelques scripts Python. Maintenant, pour exécuter ces scripts, j'ai un chemin python codé en dur. Mais ce n'est pas portable. Donc, je veux obtenir le chemin de l'exécutable Python à partir du code et l'utiliser.
Question:
Comment puis-je obtenir le chemin de l'exécutable Python utilisé par ArcMap à partir du code C #?
ÉDITER :
D'après vos suggestions, pour l'instant j'utilise "environnement de chemin" pour obtenir le chemin 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;
}
}
}
Mais il y a un problème:
Lorsque différentes versions de python sont installées sur ma machine, rien ne garantit que le "python.exe" que j'utilise, ArcGIS l'utilise également.
Je n'apprécie pas d'utiliser un autre outil pour obtenir le chemin "python.exe" . Donc, je pense vraiment qu'il existe un moyen d'obtenir le chemin d'accès à partir de la clé de registre. Pour le registre "ArcGIS10.0" ressemble à:
Et pour cela, je pense à suivre le chemin pour obtenir le chemin:
//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 ;
}
Mais avant d'utiliser la deuxième procédure, je dois être sûr de mes suppositions. Les suppositions sont:
- le "vrai" associé à python signifie que python est installé avec ArcGIS
- ArcGIS 10.0 et la clé de registre de la version supérieure seront écrits dans le même processus.
Veuillez m'aider à obtenir des éclaircissements sur mes suppositions.