আমি সি # তে আর্কম্যাপের একটি অ্যাড-ইন নিয়ে কাজ করছি। সি # কোড থেকে, আমি কিছু পাইথন স্ক্রিপ্ট কার্যকর করেছি। এখন, এই স্ক্রিপ্টটি চালানোর জন্য আমার কাছে হার্ড-কোডড অজগর পথ রয়েছে। তবে এটি বহনযোগ্য নয়। সুতরাং, আমি কোড থেকে পাইথনের পথ নির্বাহযোগ্য এবং এটি ব্যবহার করতে চাই।
প্রশ্ন:
আমি সি # কোড থেকে আর্কম্যাপ দ্বারা ব্যবহৃত পাইথন এক্সিকিউটেবলের পথ কীভাবে পেতে পারি?
সম্পাদনা:
আপনার পরামর্শগুলি থেকে, বর্তমানে আমি পাইথনের পথ পেতে "পথের পরিবেশ" ব্যবহার করছি।
//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;
}
}
}
কিন্তু একটি সমস্যা আছে:
আমার মেশিনে পাইথনের বিভিন্ন সংস্করণ ইনস্টল হওয়ার পরে, "পাইথন.এক্সে" আমি ব্যবহার করছি এমন কোনও গ্যারান্টি নেই, আর্কজিআইএসও এটি ব্যবহার করে।
"পাইথন.এক্সি" পাথ পেতে অন্য সরঞ্জামটি ব্যবহার করার জন্য আমি প্রশংসা করি না । সুতরাং, আমি সত্যিই ভাবি যে রেজিস্ট্রি কী থেকে কোনও পথ পাওয়ার উপায় আছে কিনা। জন্য "ArcGIS10.0" মত রেজিস্ট্রি দেখায়:
এবং তার জন্য, আমি পথটি পেতে নিম্নলিখিত উপায় সম্পর্কে চিন্তা করছি:
//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 ;
}
তবে দ্বিতীয় পদ্ধতিটি ব্যবহার করার আগে আমার অনুমান সম্পর্কে নিশ্চিত হওয়া দরকার। অনুমানগুলি হ'ল:
- পাইথনের সাথে যুক্ত "সত্য" অর্থ আর্কজিআইএস দিয়ে পাইথন ইনস্টল করা আছে
- আরকজিআইএস 10.0 এবং উচ্চ সংস্করণের রেজিস্ট্রি কী একই প্রক্রিয়াতে লেখা হবে।
আমার অনুমান সম্পর্কে কোনও স্পষ্টতা পেতে দয়া করে আমাকে সহায়তা করুন।