Ich arbeite mit einem Add-In von ArcMap in C #. Aus C # -Code habe ich einige Python-Skripte ausgeführt. Um dieses Skript auszuführen, habe ich den Python-Pfad fest programmiert. Dies ist jedoch nicht portabel. Daher möchte ich den Pfad der ausführbaren Python-Datei aus dem Code abrufen und verwenden.
Frage:
Wie kann ich den Pfad der von ArcMap verwendeten ausführbaren Python-Datei aus C # -Code abrufen?
EDIT:
Nach Ihren Vorschlägen verwende ich jetzt "Pfadumgebung", um Python-Pfad zu erhalten.
//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;
}
}
}
Aber es gibt ein Problem:
Wenn auf meinem Computer eine andere Version von Python installiert ist, kann nicht garantiert werden, dass die von mir verwendete "python.exe" auch von ArcGIS verwendet wird.
Ich schätze es nicht, ein anderes Tool zu verwenden, um den Pfad "python.exe" abzurufen . Also, ich denke wirklich, ob es eine Möglichkeit gibt, den Pfad vom Registrierungsschlüssel abzurufen. Die Registrierung für "ArcGIS10.0" sieht folgendermaßen aus:
Und dafür denke ich über folgenden Weg nach, um den Weg zu finden:
//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 ;
}
Aber bevor ich das zweite Verfahren verwende, muss ich mir sicher sein, was meine Vermutungen sind. Vermutungen sind:
- "True" in Verbindung mit Python bedeutet, dass Python mit ArcGIS installiert wird
- ArcGIS 10.0 und der Registrierungsschlüssel der höheren Version werden in demselben Prozess geschrieben.
Bitte helfen Sie mir, meine Vermutungen zu klären.