Tôi đang làm việc với một bổ trợ của ArcMap trong C #. Từ mã C #, tôi đã thực thi một số tập lệnh Python. Bây giờ, để chạy các script đó, tôi có đường dẫn python được mã hóa cứng. Nhưng đây không phải là di động. Vì vậy, tôi muốn lấy đường dẫn của Python thực thi từ mã và sử dụng nó.
Câu hỏi:
Làm cách nào tôi có thể nhận được đường dẫn của tệp thực thi Python được ArcMap sử dụng từ mã C #?
BIÊN TẬP :
Từ đề xuất của bạn, hiện tại tôi đang sử dụng "môi trường đường dẫn" để lấy đường dẫn 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;
}
}
}
Nhưng có một vấn đề:
Khi phiên bản khác nhau của python được cài đặt trong máy của tôi, không có gì đảm bảo rằng, "python.exe" tôi đang sử dụng, ArcGIS cũng sử dụng nó.
Tôi không đánh giá cao việc sử dụng một công cụ khác để có đường dẫn "python.exe" . Vì vậy, tôi thực sự nghĩ rằng nếu có bất kỳ cách nào để có được đường dẫn từ khoá đăng ký. Đối với sổ đăng ký "ArcGIS10.0" trông giống như:
Và vì điều đó, tôi đang suy nghĩ về cách làm theo con đường:
//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 ;
}
Nhưng trước khi sử dụng thủ tục thứ hai, tôi cần chắc chắn về dự đoán của mình. Đoán là:
- "Đúng" được liên kết với python có nghĩa là python được cài đặt với ArcGIS
- ArcGIS 10.0 và khóa đăng ký của phiên bản trên sẽ được viết theo cùng một quy trình.
Xin hãy giúp tôi để có được bất kỳ làm rõ về dự đoán của tôi.