ฉันกำลังทำงานกับ Add-in ของ ArcMap ใน C # จากรหัส C # ฉันได้เรียกใช้งานสคริปต์ Python ตอนนี้เพื่อเรียกใช้สคริปต์เหล่านี้ฉันมีเส้นทางหลามแบบตายตัว แต่นี่ไม่ใช่พกพา ดังนั้นฉันต้องการได้รับเส้นทางของการปฏิบัติการ Python จากรหัสและใช้งาน
คำถาม:
ฉันจะได้รับเส้นทางของการปฏิบัติการของ Python ที่ใช้โดย ArcMap จากรหัส C # ได้อย่างไร?
แก้ไข:
จากคำแนะนำของคุณตอนนี้ฉันใช้ "สภาพแวดล้อมของเส้นทาง" เพื่อรับเส้นทาง 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;
}
}
}
แต่มีปัญหา:
เมื่อติดตั้งงูหลามรุ่นต่าง ๆ ในเครื่องของฉันไม่มีการรับประกันว่า "python.exe" ที่ฉันใช้คือ ArcGIS ก็ใช้เช่นกัน
ฉันไม่ซาบซึ้งที่ใช้เครื่องมืออื่นเพื่อรับเส้นทาง"python.exe" ดังนั้นฉันคิดว่าถ้ามีวิธีที่จะได้รับเส้นทางจากคีย์รีจิสทรี สำหรับรีจิสทรี"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 ;
}
แต่ก่อนที่จะใช้ขั้นตอนที่สองฉันต้องแน่ใจเกี่ยวกับการคาดเดาของฉัน คาดเดาคือ:
- "จริง" ที่เกี่ยวข้องกับหลามหมายถึงงูใหญ่ถูกติดตั้งกับ ArcGIS
- ArcGIS 10.0 และรีจิสตรีคีย์ของเวอร์ชั่นที่สูงกว่าจะถูกเขียนในกระบวนการเดียวกัน
โปรดช่วยฉันให้ได้คำอธิบายเกี่ยวกับการเดาของฉัน