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.
la source
Réponses:
J'ai pris votre deuxième exemple de code, je l'ai fait fonctionner sur les systèmes d'exploitation 64 et 32 bits et je l'ai simplifié un peu. Fonctionne pour moi à la version 10.1 sur Windows 7 64 bits, mais vous devez évidemment le tester sur autant d'environnements que possible et ajouter à nouveau les vérifications de programmation défensive que vous jugez nécessaires.
Après avoir testé une installation propre d'ArcGIS Desktop 10.1 sans Python, j'ai constaté qu'il n'inclut pas la sous-clé Python10.x, sans parler de la valeur "Python" Vrai / Faux (toujours pas sûr de ce à quoi cela sert, contactez peut-être le support ESRI si vous devez savoir).
Sur une machine Desktop 10.1 avec Python, cela revient
C:\Python27\ArcGIS10.1\python.exe
. Sur une machine Desktop 10.1 sans Python, cela déclenche une InvalidOperationException car la clé Python10.x n'est pas présente.J'espère que cela vous aidera avec tout ce que vous essayez d'accomplir réellement, ce qui - étonnamment - n'est toujours pas clair pour moi.
la source
Au lieu de rechercher l'exécutable Python, cette rubrique d'aide suggère de décortiquer
cmd.exe
et d'exécuterpython.exe
sans qualifier son emplacement. Notez cependant que celadevrait fonctionner car le programme d'installation d'ArcGIS Desktop s'installe(modification: récemment testé à la version 10.1, il ne fonctionne pas) dépend du chemin àpython.exe
ajouter à laPATH
variable d'environnement de l'utilisateur .Une autre approche consiste à créer un outil de script et à l' exécuter à partir d'ArcObjects .
Si vous êtes vraiment après le chemin vers la version d'ArcGIS de
python.exe
, par extension de l'approche de l'outil de script ArcObjects +, vous pouvez créer un outil de script Python dont la seule sortie est la valeur desys.exec_prefix
. Il s'agit du chemin du dossier contenant la version d'ArcGIS de Python, par exempleC:\Python27\ArcGIS10.1
.Note latérale :
sys.executable
renvoie le chemin versArcMap.exe
et NONpython.exe
lors de l'exécution en cours de processus, c'est pourquoi je ne suggère pas d'utiliser cette variable.Appelez l'outil de script à partir d'ArcObjects et obtenez la sortie de l'
IGeoProcessorResult
objet renvoyé .Mise à jour: voici un exemple de projet de complément ArcMap (VS2010, .NET 3.5) qui utilise un outil de script intégré au complément qui affiche simplement le chemin d'accès à celui
python.exe
utilisé par ArcMap: http://wfurl.com/cbd5091C'est juste un bouton sur lequel vous cliquez et une boîte de message apparaît avec le chemin:
Les morceaux de code intéressants:
Script Python:
Fonction C #:
la source
PATH
variable d'environnement.Aurez-vous accès au registre?
Lors de l'installation d'ArcMap, il installera Python s'il ne le trouve pas. Il regarde dans le registre pour voir si Python est déjà installé. Je crois que l'emplacement de registre standard pour cela est: computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath Avec une clé par défaut de l'emplacement du chemin (2.7 étant 10.1, 2.6 étant 10.0)
Je ne peux pas penser à une raison pour laquelle / pourquoi la valeur de cette clé serait incorrecte, mais vous pouvez toujours procéder de cette façon: à l'intérieur de la ruche Esri \ Desktop du registre se trouve un emplacement Python. C'est le chemin simple que vous pouvez obtenir, puis créez d'autres chemins pour vous assurer qu'il existe un Python.exe. Par exemple, la clé sur une machine 64 bits est installée sur: ordinateur \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 avec une clé PythonDir et la valeur de chemin d'accès associée
Mais j'aime la réponse @ blah238. Ouvrez simplement une invite depuis votre programme et exécutez-la. Je ne vois pas pourquoi cela ne fonctionnerait pas.
la source
[Modifier] Bien que l'exécution par
set
programme (barrée ci-dessous) ait fait ce que je voulais, cela peut être accompli plus facilement et avec un code plus propre en utilisant Environment.GetEnvironmentVariables () .Une option consisterait à analyser chaque variable d'environnement sur le système et à essayer de prouver ce qui suit:
1) La valeur de la variable d'environnement est-elle un répertoire? (et si oui ..)
2) Ce répertoire contient-il
python.exe
?J'ai pu le faire par programme en exécutant laset
commande via l' API de processus .Net . leset
commande, lorsqu'elle est utilisée sans paramètre, renvoie TOUTES les variables d'environnement utilisées par le système. Je pourrais donc parase, puis organiser les résultats de STDOUT émis parset
, et les écran pour voir si quoi que ce soit (et je veux dire RIEN ) disponible à travers le système envionment finalement pointépython.exe
.De cette page discutant de la
set
commande:Pour illustrer, j'ai écrit une combinaison de méthodes (et une classe d'assistance ) qui fait ce que j'ai discuté ci-dessus. Ceux-ci peuvent être optimisés, et ils pourraient utiliser une protection contre les balles (Try..Catch, etc.), mais si l'ordinateur a n'importe quelle variable d'environnement pointant vers
python.exe
, cette approche devrait le trouver! Je me fiche que la var soit appeléePATH
,ABBRACADABBRA
ou quoi que ce soit .. si elle pointepython.exe
, cela devrait la trouver.Voici
terms
un tableau de chaînes que vous transmettez à la routine pour rechercher soit le nom de la variable d'environnement, soit sonn
valeurs (c'estPATH
-à- dire peuvent avoir plusieurs valeurs, mais la plupart des autres variables n'en auront qu'une). Assurez-vous que toutes les chaînesterms
sont en MAJUSCULE!(Quand j'ai testé cela, j'ai utilisé simplement "PYTHON", qui a trouvé
C:\Python27\python.exe
sur mon système domestique. Mais vous pouvez facilement l'étendre pour inclure une autre chaîne [] de termes si vous souhaitez inspecter davantage le chemin despython.exe
candidats retournés --- pour exemple, pour voir s'ils étaient dans la corbeille ArcGIS, etc.)Et au bas de ma classe principale, j'ai inclus la classe d'assistance suivante :
la source
PYTHONPATH
variable n'est PAS celle que vous souhaitez.PATH
.PYTHONPATH
, qui se trouvait être le seul var sur ce système particulier pointant verspython.exe
.) Quoi qu'il en soit, j'ai révisé ma réponse pour inclure un exemple de code C # fonctionnel, et j'apprécierais savoir si vous n'êtes toujours pas d'accord avec cette approche. Merci / E.Je voudrais proposer une solution alternative, basée sur mon commentaire dans la question ci-dessus. Pour un projet en cours, je fais quelque chose de très similaire; J'ai un complément .NET qui, lorsque l'utilisateur clique sur un bouton dans l'interface utilisateur d'ArcMap, un script Python s'exécute. J'ai rendu obligatoire la définition d'une variable d'environnement PATH sur l'exécutable ArcGIS Python, de cette façon, je n'ai pas vraiment à me soucier d'inclure le chemin d'accès à l'exe Python dans mon code .NET.
Maintenant, pendant le développement, les testeurs configurent simplement la variable PATH manuellement. Mais je finirai par avoir un programme d'installation Windows (exe) créé qui installera le complément, installera toutes les dépendances Python et définira toutes les variables PATH nécessaires. Pour cela, j'utilise le système d'installation scriptable Nullsoft (NSIS) , un système open source pour créer des programmes d'installation Windows. Voici un code que j'ai travaillé jusqu'à présent, ce qui est assez approximatif. Fondamentalement, il regarde dans le registre pour voir si les variables PATH d'intérêt sont là, et si elles ne le sont pas, il les ajoute. Doit être exécuté en tant qu'administrateur, bien sûr.
Donc, encore une fois, cela ne trouve pas le chemin vers l'exe ArcGIS Python, mais cela vous permet de donner à votre utilisateur final le pouvoir de le configurer correctement et facilement.
la source