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.
sumber
Jawaban:
Saya mengambil contoh kode kedua Anda, membuatnya bekerja pada OS 64 dan 32-bit, dan menyederhanakannya sedikit. Bekerja untuk saya di 10.1 pada Windows 7 64-bit, tetapi jelas Anda harus mengujinya di lingkungan sebanyak mungkin, dan menambahkan kembali dalam pemeriksaan pemrograman defensif apa pun yang Anda anggap perlu.
Setelah menguji bersih-menginstal ArcGIS Desktop 10.1 tanpa Python, saya menemukan bahwa itu tidak termasuk subkey Python10.x, apalagi nilai "Python" Benar / Salah (masih tidak yakin untuk apa itu, mungkin hubungi dukungan ESRI jika Anda harus tahu).
Pada mesin Desktop 10.1 dengan Python, ini kembali
C:\Python27\ArcGIS10.1\python.exe
. Pada mesin Desktop 10.1 tanpa Python, ini memunculkan InvalidOperationException karena kunci Python10.x tidak ada.Semoga ini membantu Anda dengan apa pun yang ingin Anda capai, yang - luar biasa - masih belum jelas bagi saya.
sumber
Alih-alih mencari Python yang dapat dieksekusi, topik bantuan ini menyarankan keluar
cmd.exe
dan berjalanpython.exe
tanpa memenuhi syarat lokasinya. Namun perlu dicatat, iniharus berhasil karena penginstal ArcGIS Desktop mengatur(edit: baru-baru ini diuji pada 10.1, tidak) bergantung pada jalur yangpython.exe
akan ditambahkan kePATH
variabel lingkungan pengguna .Pendekatan lain adalah membuat alat skrip dan menjalankannya dari ArcObjects .
Jika Anda benar-benar mengikuti jalur ke versi ArcGIS
python.exe
, dengan perluasan pendekatan alat skrip ArcObjects +, Anda bisa membuat alat skrip Python yang hanya menghasilkan output nilaisys.exec_prefix
. Ini adalah path folder yang berisi versi Python ArcGIS, misalnyaC:\Python27\ArcGIS10.1
.Catatan samping :
sys.executable
mengembalikan jalur keArcMap.exe
dan BUKANpython.exe
saat dijalankan dalam proses, itulah sebabnya saya tidak menyarankan menggunakan variabel itu.Panggil alat skrip dari ArcObjects dan dapatkan output dari
IGeoProcessorResult
objek yang dikembalikan .Pembaruan: Berikut adalah contoh proyek tambahan ArcMap (VS2010, .NET 3.5) yang menggunakan alat skrip yang dikemas dalam add-in yang hanya menampilkan jalur ke yang
python.exe
digunakan oleh ArcMap: http://wfurl.com/cbd5091Ini hanya tombol yang Anda klik dan muncul kotak pesan dengan path:
Bit kode yang menarik:
Skrip python:
Fungsi C #:
sumber
PATH
variabel lingkungan.Apakah Anda memiliki akses ke registri?
Ketika menginstal ArcMap, itu akan menginstal Python jika tidak dapat menemukannya. Itu terlihat di registri untuk melihat apakah Python sudah diinstal. Saya percaya lokasi registri standar untuk ini adalah: computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ PYTHON \ PythonCore \ 2.7 \ InstallPath Dengan Kunci default dari lokasi Path (2.7 menjadi 10.1, 2.6 menjadi 10.0)
Saya tidak bisa memikirkan alasan kapan / mengapa nilai kunci ini salah, tetapi Anda selalu bisa seperti ini: Di dalam kumpulan Esri \ Desktop registri adalah lokasi Python. Ini adalah jalur sederhana yang bisa Anda dapatkan dan kemudian membangun jalur lebih lanjut untuk memastikan ada Python.exe. Sebagai contoh, kunci pada mesin 64bit diinstal ke: computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ESRI \ Python10.1 Dengan kunci PythonDir dan nilai Path yang terkait
Tapi saya suka jawaban @ blah238. Cukup buka prompt dari program Anda dan jalankan di sana. Saya tidak dapat melihat alasan mengapa ini tidak berhasil.
sumber
[Sunting] Saat menjalankan secara
set
program (muncul, di bawah) melakukan apa yang saya inginkan, itu dapat diselesaikan dengan lebih mudah dan dengan kode yang lebih bersih menggunakan Environment.GetEnvironmentVariables () .Salah satu opsi adalah memindai setiap Variabel Lingkungan pada sistem dan berusaha membuktikan yang berikut:
1) Apakah nilai Variabel Lingkungan merupakan direktori? (dan jika demikian..)
2) Apakah direktori itu mengandung
python.exe
?Saya dapat melakukan ini secara terprogram dengan mengeksekusiset
perintah melalui. Net Process API . Theset
perintah, bila digunakan tanpa parameter, mengembalikan SEMUA Variabel Lingkungan digunakan oleh sistem. Jadi saya bisa membuat parase, kemudian mengatur hasil STDOUT yang dipancarkanset
, dan menyaringnya untuk melihat apakah ada sesuatu (dan maksud saya APA SAJA ) yang tersedia melalui sistem lingkungan yang pada akhirnya ditunjukkanpython.exe
.Dari halaman ini membahas
set
perintah:Sebagai ilustrasi saya menulis kombinasi metode (dan kelas pembantu ) yang melakukan apa yang saya bahas di atas. Ini dapat dioptimalkan, dan mereka dapat menggunakan beberapa pemeriksaan-peluru (Coba..Catch, dll), tetapi jika komputer memiliki APAPUN Variabel Lingkungan APAPUN menunjuk ke
python.exe
, pendekatan ini harus menemukannya! Saya tidak peduli jika var disebutPATH
,ABBRACADABBRA
, atau apa pun .. jika menunjuk kepython.exe
, ini harus menemukannya.Berikut
terms
ini adalah array string yang Anda berikan pada rutinitas untuk mencari nama variabel lingkungan, ataun
nilainya (yaituPATH
dapat memiliki beberapa nilai, tetapi sebagian besar vars lainnya hanya memiliki satu). Pastikan semua string dalamterms
UPPERCASE!(Ketika saya menguji ini, saya hanya menggunakan "PYTHON", yang ditemukan
C:\Python27\python.exe
pada sistem rumah saya. Tetapi Anda dapat dengan mudah memperluasnya untuk memasukkan string [] istilah lain jika Anda ingin memeriksa lebih lanjut jalurpython.exe
kandidat yang dikembalikan --- untuk contoh, untuk melihat apakah mereka berada di nampan ArcGIS, dll.)Dan di bagian bawah kelas utama saya, saya menyertakan Kelas Penolong berikut :
sumber
PYTHONPATH
variabel BUKAN yang Anda inginkan.PATH
.PYTHONPATH
, yang kebetulan menjadi satu - satunya var pada sistem tertentu yang menunjuk kembalipython.exe
.) Bagaimanapun, saya merombak jawaban saya untuk memasukkan contoh kode C # yang berfungsi, dan saya akan sangat menghargai mengetahui apakah Anda masih tidak setuju dengan pendekatan ini. Terima kasih / e.Saya ingin menawarkan solusi alternatif, berdasarkan komentar saya dalam pertanyaan di atas. Untuk proyek saat ini, saya melakukan sesuatu yang sangat mirip; Saya memiliki .NET Add-In itu, ketika pengguna mengklik tombol di ArcMap UI, skrip Python berjalan. Saya membuat memiliki variabel lingkungan PATH diatur ke ArcGIS Python dieksekusi persyaratan, dengan cara itu saya tidak benar-benar perlu khawatir tentang memasukkan path ke exe Python dalam kode .NET saya.
Sekarang, sementara dalam pengembangan, penguji hanya mengatur variabel PATH secara manual. Tapi saya akhirnya akan memiliki installer Windows (exe) dibuat yang akan menginstal Add-In, menginstal dependensi Python, dan mengatur variabel PATH yang diperlukan. Untuk ini, saya menggunakan Nullsoft Scriptable Install System (NSIS) , sistem open source untuk membuat installer Windows. Berikut adalah beberapa kode yang telah saya upayakan sejauh ini, yang cukup kasar. Pada dasarnya, ini terlihat dalam registri untuk melihat apakah variabel-variabel PATH yang menarik ada di sana, dan jika mereka tidak menambahkannya. Harus dijalankan sebagai admin, tentu saja.
Jadi, sekali lagi, ini tidak menemukan jalan ke exe ArcGIS Python, tetapi ini memungkinkan Anda untuk memberi pengguna akhir Anda kekuatan untuk mengaturnya dengan benar dan mudah.
sumber