Saya bekerja dengan add-in dari ArcMap di C #. Dari kode C #, saya telah menjalankan beberapa skrip Python. Sekarang, untuk menjalankan skrip itu, saya memiliki jalur python hard-coded. Tapi ini tidak portabel. Jadi, saya ingin mendapatkan jalur dari Python yang dapat dieksekusi dari kode dan menggunakannya.
Pertanyaan:
Bagaimana saya bisa mendapatkan path dari executable Python yang digunakan oleh ArcMap dari kode C #?
EDIT:
Dari saran Anda, untuk saat ini saya menggunakan "jalur lingkungan" untuk mendapatkan jalur 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;
}
}
}
Tapi ada masalah:
Ketika versi berbeda dari python diinstal di mesin saya, tidak ada jaminan bahwa, "python.exe" yang saya gunakan, ArcGIS juga menggunakan itu.
Saya tidak menghargai menggunakan alat lain untuk mendapatkan jalur "python.exe" . Jadi, saya benar-benar berpikir jika ada cara untuk mendapatkan jalur dari kunci registri. Untuk registri "ArcGIS10.0" terlihat seperti:
Dan untuk itu, saya berpikir tentang cara berikut untuk mendapatkan jalan:
//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 ;
}
Tetapi sebelum menggunakan prosedur kedua, saya harus yakin tentang dugaan saya. Tebakannya adalah:
- "True" yang terkait dengan python berarti python diinstal dengan ArcGIS
- ArcGIS 10.0 dan kunci registri versi atas akan ditulis dalam proses yang sama.
Tolong bantu saya untuk mendapatkan klarifikasi tentang tebakan saya.