Memeriksa apakah skrip python dijalankan dari ArcGIS (arcmap atau di server) atau skrip python yang berdiri sendiri

8

Untuk keperluan debugging, saya telah membuat kondisional dengan kode sandi yang memeriksanya bahwa skrip dijalankan sebagai alat yang berdiri sendiri atau sebagai alat ArcGIS. Apakah ada cara untuk mengatasi hal ini saat run time? misalnya beberapa variabel lingkungan, variabel global, dll.

misalnya

dryRun= 1
if dryRun:
    par= 'Hello'
else:
    par= arcpy.GetParameterAsText(0)
# Do something
Mahdi
sumber

Jawaban:

19

Periksa sys.executable.

Di jendela Python:

>>> import sys
>>> sys.executable
'C:\\Program Files (x86)\\ArcGIS\\Desktop10.2\\bin\\ArcMap.exe'

dan kemudian di Python.exe:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.executable
'C:\\Python27\\ArcGIS10.2\\python.exe'

Jadi yang sederhana if os.path.basename(sys.executable).lower() == 'python.exe'harus melakukannya.

Jason Scheirer
sumber
Terima kasih, tetapi tujuan utama saya adalah untuk memeriksa antara menjalankan lokal vs menjalankan server (yaitu sebagai layanan geoproses - saya pikir itu namanya)
Mahdi
Saya percaya itu sys.executableakan menjadi sesuatu yang berbeda ketika dijalankan sebagai alat server juga. Tulis skrip pengujian yang arcpy.AddMessage("Executable: " + sys.executable)akan dikonfirmasi.
Jason Scheirer
1

Jika saya memahami pertanyaan Anda dengan benar, Anda ingin memeriksa untuk melihat apakah Anda menjalankan skrip sebagai alat skrip atau tidak. Jika ini berjalan sebagai alat skrip, Anda ingin mengatur beberapa variabel menggunakan GetParameterAsText, dan jika itu berjalan sebagai mandiri, Anda ingin menggunakan beberapa variabel kode keras, apakah ini benar? Jika demikian, Anda dapat melakukan hal berikut:

if len(sys.argv) > 1:
    #Assign input and output parameters for script tool
    par = arcpy.GetParameterAsText(0)
else:
    # Hard coded parameters for testing
    par = 'Hello'

Dengan memeriksa panjang sys.argv Anda menentukan berapa banyak parameter yang diteruskan ke skrip. Selalu ada setidaknya satu parameter (lokasi skrip itu sendiri), jadi jika ada lebih dari satu yang dilewati, Anda dapat mengasumsikan bahwa ArcGIS mengirimkannya (kecuali Anda kebetulan melewati argumen dari tempat lain).

kaki biru
sumber
baik, ini agak berfungsi untuk saat ini b / c Saya tidak memberikan argumen tetapi apakah ada cara yang lebih "elegan"?
Mahdi
Jika dengan elegan, maksud Anda lebih pendek, Anda dapat membuatnya satu kalimat seperti:par = arcpy.GetParameterAsText(0) if len(sys.argv) > 1 else 'Hello'
Paul
oleh "elegan" maksudku sesuatu seperti memeriksa variabel lingkungan, dll. Tidak "elegan" dalam arti python. BTW, sementara saya menggunakan struktur ini sendiri banyak, dalam kasus yang kita bahas, kita kemungkinan besar mengatur banyak params untuk skrip, sehingga short-ifs tidak akan benar-benar elegan.
Mahdi
0

Cara sederhana untuk melakukannya adalah seperti ini:

import arcpy
par = arcpy.GetParameterAsText(0)
if not par: #If no parameter has been passed, an empty string is returned
  par = 'Hello'
Paul
sumber
Saya tidak mencobanya sebelumnya, tapi saya pikir itu akan menimbulkan pengecualian, ini pasti menarik ... namun, tidak akan membiarkan saya untuk memperbaiki bagian dari logika kode berdasarkan pada alat yang berdiri sendiri vs alat.
Mahdi
Apa lagi yang perlu Anda ubah selain parameter jika skrip dijalankan dari luar ArcMap?
Paul