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.
quelle
Antworten:
Ich nahm Ihr zweites Codebeispiel, ließ es auf 64- und 32-Bit-Betriebssystemen funktionieren und vereinfachte es ein wenig. Funktioniert für mich mit 10.1 unter Windows 7 64-Bit, aber Sie sollten es natürlich in so vielen Umgebungen wie möglich testen und bei den von Ihnen als notwendig erachteten defensiven Programmierüberprüfungen wieder hinzufügen.
Nach dem Testen der Neuinstallation von ArcGIS Desktop 10.1 ohne Python stellte ich fest, dass der Unterschlüssel Python10.x nicht enthalten ist, geschweige denn der Wert "Python" True / False kennt).
Auf einem Desktop 10.1-Computer mit Python wird dies zurückgegeben
C:\Python27\ArcGIS10.1\python.exe
. Auf einem Desktop 10.1-Computer ohne Python wird eine InvalidOperationException ausgelöst, da der Schlüssel Python10.x nicht vorhanden ist.Hoffentlich hilft dir das bei allem, was du tatsächlich erreichen willst, was mir - erstaunlicherweise - immer noch nicht klar ist.
quelle
Anstatt nach der ausführbaren Python-Datei zu suchen, wird in diesem Hilfethema vorgeschlagen, die Ausführung zu
cmd.exe
beenden,python.exe
ohne den Speicherort zu qualifizieren. Beachten Sie jedoch, dass diesfunktionierensollte , da das Einrichten des ArcGIS Desktop-Installationsprogramms(Bearbeiten: vor kurzem bei 10.1 getestet, nicht bei 10.1 getestet) davon abhängt, dass der Pfad zur Umgebungsvariablenpython.exe
des Benutzers hinzugefügtPATH
wird.Ein weiterer Ansatz ist es, einen erstellen Skript - Tool und es von ArcObjects ausführen .
Wenn Sie wirklich den Pfad zur ArcGIS-Version von
python.exe
suchen, können Sie in Erweiterung des ArcObjects + -Skripttool-Ansatzes ein Python-Skripttool erstellen, dessen einzige Ausgabe der Wert von istsys.exec_prefix
. Dies ist der Pfad des Ordners, der die ArcGIS-Version von Python enthält, zC:\Python27\ArcGIS10.1
.Randnotiz :
sys.executable
Gibt den Pfad zuArcMap.exe
und NICHT zurück,python.exe
wenn sie in-process ausgeführt werden, weshalb ich nicht vorschlage, diese Variable zu verwenden.Rufen Sie das Skriptwerkzeug in ArcObjects auf und rufen Sie die Ausgabe des zurückgegebenen
IGeoProcessorResult
Objekts ab.Update: In diesem Beispielprojekt für ein ArcMap-Add-In (VS2010, .NET 3.5) wird ein im Add-In enthaltenes Skript-Tool verwendet, das einfach den Pfad zu dem
python.exe
von ArcMap verwendeten Pfad anzeigt: http://wfurl.com/cbd5091Es ist nur eine Schaltfläche, auf die Sie klicken, und es wird ein Nachrichtenfenster mit dem folgenden Pfad angezeigt:
Die interessanten Teile des Codes:
Python-Skript:
C # -Funktion:
quelle
PATH
Umgebungsvariablen gefunden werden soll.Haben Sie Zugriff auf die Registrierung?
Bei der Installation von ArcMap wird Python installiert, wenn es nicht gefunden wird. In der Registrierung wird geprüft, ob Python bereits installiert ist. Ich glaube, der Standardspeicherort für die Registrierung ist: computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath Mit einem Standardschlüssel für den Pfadspeicherort (2.7 ist 10.1, 2.6 ist 10.0)
Ich kann mir keinen Grund vorstellen, wann / warum der Wert dieses Schlüssels falsch wäre, aber Sie könnten immer so vorgehen: In der Esri \ Desktop-Struktur der Registrierung befindet sich ein Python-Speicherort. Es ist der einfache Pfad, den Sie abrufen und dann weitere Pfade aufbauen können, um sicherzustellen, dass eine Python.exe vorhanden ist. Beispielsweise wird der Schlüssel auf einem 64-Bit-Computer installiert unter: computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 Mit einem PythonDir-Schlüssel und einem zugeordneten Pfadwert
Aber ich mag @ blah238 Antwort. Öffnen Sie einfach eine Eingabeaufforderung in Ihrem Programm und führen Sie sie dort aus. Ich kann keinen Grund sehen, warum das nicht funktionieren würde.
quelle
[Bearbeiten] Während die
set
programmgesteuerte Ausführung (siehe unten) das getan hat, was ich wollte, kann sie mit Environment.GetEnvironmentVariables () einfacher und mit saubererem Code ausgeführt werden .Eine Möglichkeit wäre, jede Umgebungsvariable im System zu scannen und Folgendes zu beweisen:
1) Ist die Umgebungsvariable ein Verzeichnis? (und wenn..)
2) Enthält dieses Verzeichnis
python.exe
?Ich konnte dies programmgesteuert tun, indem ich denset
Befehl über die .NET- Prozess-API ausführte . Derset
Befehl, wenn ohne Parameter verwendet wird , gibt alle Umgebungsvariablen in Verwendung durch das System. So konnte ich die von STDOUT ausgegebenen Ergebnisse parasieren, dann organisierenset
und sie überprüfen, um festzustellen , ob in der Systemumgebung, auf die letztendlich verwiesen wurde, irgendetwas verfügbar ist (und ich meine ALLES )python.exe
.Auf dieser Seite wird der
set
Befehl erläutert:Zur Veranschaulichung habe ich eine Kombination von Methoden (und eine Hilfsklasse ) geschrieben, die das tun, was ich oben besprochen habe. Diese können optimiert werden, und sie könnten eine Art Kugelsicherung (Try..Catch usw.) verwenden. Wenn der Computer jedoch auf eine beliebige Umgebungsvariable verweist,
python.exe
sollte diese Methode sie finden! Es ist mir egal, ob der var aufgerufenPATH
wirdABBRACADABBRA
oder was auch immer. Wenn er darauf hinweistpython.exe
, sollte er gefunden werden.Hier
terms
ist ein Array von Zeichenfolgen, die Sie an die Routine übergeben, um entweder im Namen der Umgebungsvariablen oder in ihrenn
Werten zu suchen (dh siePATH
können mehrere Werte haben, aber die meisten anderen Variablen haben nur einen). Stellen Sie sicher, dass alle Zeichenfolgen interms
GROSSBUCHSTABEN sind!(Als ich das getestet habe, habe ich einfach "PYTHON" verwendet, das
C:\Python27\python.exe
auf meinem Heimsystem zu finden ist. Sie können es jedoch problemlos um eine weitere Zeichenfolge [] von Begriffen erweitern, wenn Sie den Pfad von zurückgegebenenpython.exe
Kandidaten weiter untersuchen möchten B. um zu sehen, ob sie sich im ArcGIS-Bin befinden, usw.)Und am Ende meiner Hauptklasse habe ich die folgende Helferklasse eingefügt :
quelle
PYTHONPATH
Variable ist NICHT die, die Sie wollen.PATH
.PYTHONPATH
, dass dies zufällig die einzige Variable auf diesem speziellen System war, auf die zurückgegriffen wurdepython.exe
.) Wie auch immer, ich habe meine Antwort überarbeitet, um ein funktionierendes C # -Codebeispiel aufzunehmen, und ich würde es begrüßen zu wissen, ob Sie mit diesem Ansatz noch nicht einverstanden sind. Danke / E.Ich möchte eine alternative Lösung anbieten, basierend auf meinem Kommentar in der obigen Frage. Für ein aktuelles Projekt mache ich etwas sehr Ähnliches; Ich habe ein .NET-Add-In, das ein Python-Skript ausführt, wenn der Benutzer auf eine Schaltfläche in der ArcMap-Benutzeroberfläche klickt. Ich habe das Festlegen einer PATH-Umgebungsvariablen für die ausführbare ArcGIS-Python-Datei zu einer Anforderung gemacht. Auf diese Weise muss ich mich nicht wirklich darum kümmern, den Pfad zur Python-Exe in meinen .NET-Code aufzunehmen.
Während der Entwicklung richten Tester die PATH-Variable jetzt nur noch manuell ein. Aber irgendwann werde ich ein Windows-Installationsprogramm (exe) erstellen lassen, das das Add-In installiert, alle Python-Abhängigkeiten installiert und alle erforderlichen PATH-Variablen festlegt. Dafür verwende ich das Nullsoft Scriptable Install System (NSIS) , ein Open-Source-System zum Erstellen von Windows-Installationsprogrammen. Hier ist der Code, den ich bisher ausgearbeitet habe, der ziemlich rau ist. Grundsätzlich wird in der Registrierung geprüft, ob die interessierenden PATH-Variablen vorhanden sind, und wenn nicht, werden sie hinzugefügt. Muss natürlich als Administrator ausgeführt werden.
Auch hier wird der Pfad zur ArcGIS Python-Exe nicht gefunden, aber Sie können dem Endbenutzer die Befugnis geben, diese ordnungsgemäß und einfach festzulegen.
quelle