bisakah dapat mendeteksi apakah itu berjalan di Desktop atau Server?

9

Saya mengembangkan beberapa kode yang ingin saya jalankan baik sebagai layanan web ArcGIS Server dan sebagai skrip mandiri. Saya ingin dapat memodifikasi eksekusi sedikit tergantung pada apakah itu berjalan sebagai layanan web AGS atau sebagai python mandiri / dalam Desktop.

Apakah ada cara untuk mendeteksi ini?

Saya sudah melakukan pencarian tetapi belum menemukan sesuatu yang sangat memuaskan. Saya telah melihat arcpy.mapping.CreateGISServerConnectionFile, tetapi ini menetapkan koneksi ke server yang bertentangan dengan memeriksa lingkungan saat ini. Saya juga mencari informasi tentang bagaimana layanan dijalankan dengan AGS (misalnya, ini ), tapi saya tidak benar-benar melihat apa pun di sepanjang jenis fungsi arcpy.isWebService (). Apakah saya hanya perlu memeriksa lingkungan (ingin melihat apakah "% scratchFolder% telah disetel atau memeriksa sesuatu yang berkaitan dengan sys.argv)? Sepertinya merupakan solusi yang tidak stabil.

Roland
sumber

Jawaban:

5

Saya menyarankan ini, setelah melihat-lihat hasil sys.executable, arcpy.GetInstallInfo (), ListInstallations (), dan ProductInfo (), tidak ada yang memberi saya jawaban yang baik tentang arcpy yang saya jalankan. @ Khibma, sesuatu untuk dipikirkan oleh tim arcpy - ini akan menjadi properti yang bagus (arcpy.version - seperti sys.version) untuk dimiliki.

>>> import arcpy
>>> arcpy.__file__
'C:\\ArcGIS\\Desktop10.1\\arcpy\\arcpy\\__init__.py'

Saya melakukan tes ini sebagai fungsi. Jika Anda perlu mengetahui bit Python, saya pikir yang terbaik adalah hanya menguji sys.versi untuk mengandung "32 bit" jadi saya tidak memasukkannya. Menggali versi ArcGIS sedikit lebih banyak kode jadi saya pergi ke depan dan memasukkannya ke dalam fungsi.

# report arcpy platform and version
# author: Curtis Price, [email protected]
# date: 2014/08/09 (update to support ArcGIS Pro)

def ArcPyVersion():
    """Report ArcPy version

    example

    >>> ArcPyVersion()
    'Desktop 10.1.3143'
    """
    import arcpy
    f = arcpy.__file__
    if f.find("Desktop") > 0:
      v = "Desktop" 
    elif f.lower().find("arcgis pro") > 0:
      v = "ArcGISPro"
    else:
      v = "Server"
    i = arcpy.GetInstallInfo()
    v = "{0} {1}.{2}".format(
            v, i["Version"], i["BuildNumber"])
    return v 
Harga Curtis
sumber
1
Jadi sepertinya arcpy .__ file__, arcpy.GetInstallInfo (), dan arcpy.ProductInfo () semua akan menghasilkan informasi yang serupa (bahkan jika yang satu menghasilkan "Desktop" sementara yang lain menghasilkan "ArcInfo"). Saya sedang memikirkan opsi arcpy.ProductInfo () adalah opsi yang paling ringkas dan mudah dibaca.
Roland
Belum mengujinya tetapi productinfo dapat memberi Anda tingkat lisensi tertinggi yang tersedia jika Anda belum secara khusus mengimpornya dengan "import arceditor" misalnya). Berarti jika Anda hanya memiliki ArcEditor tersedia, itulah yang mungkin Anda akan dapatkan kembali. Lucu bahwa Server tidak melakukan hal yang sama, karena ia juga mendukung beberapa level lisensi (dasar, standar, perusahaan)
Curtis Price
Perlu dicatat bahwa kode Python ini menganggap perangkat lunak diinstal menggunakan konvensi penamaan folder normal. Sangat jarang bagi seseorang untuk tidak menggunakan nama folder default "Desktop10.1" bahkan jika mereka dapat memindahkan path (misalnya, kami menginstal ke "C: \ ArcGIS \ Desktop10.1".
Curtis Price
8

@ Khibma dan yang lainnya membuat saya bertanya-tanya apakah saya bisa mendapatkan informasi dengan menggunakan arcpy untuk memeriksa versinya. Aku menggali agak membabi buta dan kupikir aku punya sesuatu walaupun itu bukan yang kuharapkan. Saya belum memeriksa di bawah AGS.

Ini menghasilkan diktik yang bagus:

>>> d=arcpy.GetInstallInfo()
>>> d

{'BuildNumber': u'2414',
 'InstallDate': u'5/16/2012',
 'InstallDir': u'C:\\ArcGIS\\Desktop10.0\\',
 'InstallTime': u'16:32:14',
 'InstallType': u'N/A',
 'Installer': u'abock',
 'ProductName': u'desktop',
 'SPBuild': u'10.0.4.4000',
 'SPNumber': u'4',
 'SourceDir': u'\\\\igskahhwvsawesm\\arcgis_10\\Desktop\\Desktop\\',
 'Version': u'10.0'}

Jadi saya bisa mengatakan:

if d['ProductName'] == u'desktop':
    ...
else:
    ....

Terima kasih telah menendang itu!

Roland
sumber
Hanya memperhatikan ini kembali sebagai "Desktop" di 10.1, jadi lebih baik menempatkan itu jika pernyataan untuk menggunakan d ['ProductName']. Lebih rendah ().
Roland
Bisakah Anda memposting apa hasilnya di Server? Dapat bermanfaat untuk referensi di masa mendatang.
Petr Krebs
Pastinya. Maaf atas keterlambatannya. Harus melalui rekan saya yang menjalankan instalasi AGS. Di bawah 10.1, ia mendapat "Server". Kami tidak memiliki turunan 10,0 AGS, tetapi menjalankan hasilnya melalui semacam fungsi kapitalisasi mungkin ide yang bagus.
Roland
Saya lupa tentang arcpy.GetInstallInfo (). Walaupun tujuannya bukan untuk memberi tahu Anda apa yang sedang Anda jalankan (fungsinya hampir sama dengan ListInstallations ... Saya percaya ini hanya mengembalikan engine | desktop saat dijalankan dari 32 dan server saat dijalankan dari 64bit Python. Tetapi jika Anda ' kembali pada 10.0 seperti yang ditunjukkan dalam pesan Anda, Anda akan memiliki server dan desktop untuk memutuskan
KHibma
2
@Roland jadi saya menguji beberapa hal lagi setelah berbicara dengan seorang rekan. Saya tidak punya 10.0 dengan DT / AGS pada machien yang sama, jadi saya tidak tahu bagaimana ini akan berjalan, tetapi coba "arcpy.ProductInfo ()". Ini memberi tahu Anda ArcINFO atau ArcSERVER ... ini sebenarnya dapat melakukannya untuk Anda JIKA Anda menjalankan pada DT, atau skrip sebagai Layanan GP di KEDUA 10.0 dan 10.1
KHibma
1
arcpy.ListInstallations()
[u'desktop', u'engine', u'server']

Jadi Anda bisa melakukan pengecekan terhadap apa yang diinstal. Namun ini tidak akan membuat Anda jauh jika DT dan Server diinstal pada mesin yang sama. Adapun fungsi yang memberitahu Anda apa yang Anda jalankan di bawah, tidak, tidak ada.

Berpikir keras: DT adalah 32bit, Server 64bit. Anda bisa melakukan sys.path dan memeriksa versi Python yang sedang digunakan.

atau

Jika Anda tahu itu berjalan sebagai Layanan GP (tidak hanya menggunakan server python) vs DT, Anda bisa memeriksa jalur arcpy.env.scratchFolder. Pada instalasi yang umum, ia akan selalu terlihat seperti C: \ arcgisserver \ directories \ arcgisjobs \ [service] _gpserver \ [guid] \ ....

KHibma
sumber
Dan jangan lupa bahwa ArcGIS Desktop 10.1 memiliki opsi untuk menginstal geoprocessing latar belakang 64-bit yang menginstal Python 64-bit.
MLowry
Tidakkah metode ini untuk memanggil ArcObjects dari python memungkinkan Anda memanggil RuntimeManager.ActiveRuntime ?
Kirk Kuykendall
2
RuntimeManageradalah .NET, bukan objek COM.
Petr Krebs
C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dlladalah tipe perpustakaan yang dapat memuat yang memiliki banyak objek yang sama, Anda dapat menggunakannya dari comtypes.
Jason Scheirer