arcpy สามารถตรวจจับว่ามันกำลังทำงานอยู่ในเดสก์ท็อปหรือเซิร์ฟเวอร์หรือไม่?


9

ฉันกำลังพัฒนาโค้ดบางส่วนที่ฉันต้องการเรียกใช้ทั้งสองเป็นบริการเว็บเซิร์ฟเวอร์ ArcGIS และเป็นสคริปต์แบบสแตนด์อโลน ฉันต้องการที่จะสามารถแก้ไขการดำเนินการเล็กน้อยขึ้นอยู่กับว่ามันทำงานเป็นบริการเว็บ AGS หรือเป็นงูหลามแบบสแตนด์อโลน / ภายในเดสก์ท็อป

มีวิธีตรวจจับสิ่งนี้หรือไม่?

ฉันค้นหาเสร็จแล้ว แต่ไม่พบสิ่งที่น่าพอใจมาก ฉันได้เห็นarcpy.mapping.CreateGISServerConnectionFile แล้วแต่นี่เป็นการตั้งค่าการเชื่อมต่อกับเซิร์ฟเวอร์แทนที่จะตรวจสอบสภาพแวดล้อมปัจจุบัน ฉันยังค้นหาข้อมูลเกี่ยวกับวิธีการเรียกใช้บริการโดยใช้ AGS (เช่นนี้ ) แต่ฉันไม่เห็นอะไรเลยในแนวของฟังก์ชันประเภท arcpy.isWebService () ฉันต้องตรวจสอบสภาพแวดล้อม (เช่นเพื่อดูว่า "% scratchFolder% ถูกตั้งค่าหรือตรวจสอบบางสิ่งที่เกี่ยวข้องกับ sys.argv) หรือไม่ดูเหมือนโซลูชันที่ไม่เสถียร

คำตอบ:


5

ฉันแนะนำสิ่งนี้หลังจากดูผลลัพธ์ของ sys.executable, arcpy.GetInstallInfo (), ListInstallations () และ ProductInfo () ไม่มีคำตอบใดที่ดีสำหรับฉันที่ arcpy ฉันทำงานอยู่ @KHibma บางสิ่งบางอย่างสำหรับทีม arcpy ที่จะคิด - มันจะเป็นคุณสมบัติที่ดี (arcpy.version - เช่น sys.version) ที่จะมี

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

ฉันใช้การทดสอบนี้เป็นฟังก์ชั่น หากคุณจำเป็นต้องรู้บิต Python ฉันคิดว่าเป็นการทดสอบ sys.version ที่ดีที่สุดสำหรับการบรรจุ "32 บิต" ดังนั้นฉันจึงไม่ได้รวมสิ่งนั้น การขุดออกเวอร์ชั่น ArcGIS เป็นรหัสอีกเล็กน้อยดังนั้นฉันจึงไปข้างหน้าและรวมไว้ในฟังก์ชัน

# report arcpy platform and version
# author: Curtis Price, cprice@usgs.gov
# 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 

1
ดังนั้นมันจึงดูเหมือนว่า arcpy .__ file__, arcpy.GetInstallInfo () และ arcpy.ProductInfo () จะให้ข้อมูลที่คล้ายกันทั้งหมด ฉันคิดว่าตัวเลือก arcpy.ProductInfo () เป็นตัวเลือกที่กระชับและอ่านง่ายที่สุด
Roland

ยังไม่ได้ทดสอบ แต่ productinfo อาจให้สิทธิ์การใช้งานในระดับสูงสุดหากคุณไม่ได้นำเข้าโดยเฉพาะด้วย "import arceditor" เป็นต้น) หมายความว่าถ้าคุณมี ArcEditor เท่านั้นนั่นคือสิ่งที่คุณจะได้รับ ตลกที่เซิร์ฟเวอร์ไม่ได้ทำสิ่งเดียวกันเพราะมันยังรองรับหลายระดับสิทธิ์การใช้งาน (พื้นฐานมาตรฐานองค์กร)
Curtis ราคา

ควรสังเกตว่ารหัส Python นี้ถือว่าซอฟต์แวร์ได้รับการติดตั้งโดยใช้หลักการตั้งชื่อโฟลเดอร์ปกติ มันค่อนข้างหายากสำหรับใครบางคนที่จะไม่ใช้ชื่อโฟลเดอร์เริ่มต้น "Desktop10.1" evn หากพวกเขาอาจย้ายเส้นทางไปรอบ ๆ (ตัวอย่างเช่นเราติดตั้งไปที่ "C: \ ArcGIS \ Desktop10.1"
Curtis Price

8

@KHibma และคนอื่นทำให้ฉันสงสัยว่าฉันอาจได้รับข้อมูลโดยใช้ arcpy เพื่อตรวจสอบรุ่น ฉันขุดไปค่อนข้างสุ่มสี่สุ่มห้าและฉันคิดว่าฉันมีบางอย่างแม้ว่าจะไม่ใช่สิ่งที่ฉันคาดหวัง ฉันยังไม่ได้ตรวจสอบภายใต้ AGS

มันผลิตพจน์ที่ดี:

>>> 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'}

ดังนั้นฉันสามารถพูดได้:

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

ขอบคุณที่เตะมันไปรอบ ๆ !


เพิ่งสังเกตเห็นว่าสิ่งนี้กลับมาเป็น "เดสก์ท็อป" ใน 10.1 ดังนั้นควรหาที่ที่ดีกว่าถ้าคำสั่งให้ใช้ d ['ชื่อผลิตภัณฑ์']. lower ()
Roland

คุณสามารถโพสต์สิ่งที่ผลลัพธ์บนเซิร์ฟเวอร์ได้หรือไม่? อาจมีประโยชน์สำหรับการอ้างอิงในอนาคต
Petr Krebs

อย่างแน่นอน. ขออภัยในความล่าช้า. ต้องผ่านเพื่อนร่วมงานของฉันที่รันการติดตั้ง AGS ภายใต้ 10.1 เขาได้ "เซิร์ฟเวอร์" เราไม่มีอินสแตนซ์ 10.0 AGS แต่การเรียกใช้ผลลัพธ์ผ่านฟังก์ชันการใช้ตัวพิมพ์ใหญ่บางอย่างอาจเป็นความคิดที่ดี
Roland

ฉันลืมเกี่ยวกับ arcpy.GetInstallInfo () ในขณะที่จุดประสงค์ไม่ได้บอกคุณว่าคุณกำลังทำงานอะไรอยู่ (มันทำหน้าที่เหมือนกับ ListInstallations มาก ... ฉันเชื่อว่ามันจะส่งคืนเฉพาะเครื่องยนต์ | เดสก์ท็อปเมื่อเรียกใช้จาก 32 และเซิร์ฟเวอร์เมื่อทำงานจาก 64 บิต Python แต่ถ้าคุณ กลับมาที่ 10.0 เหมือนที่แสดงในข้อความของคุณคุณจะมีทั้งเซิร์ฟเวอร์และเดสก์ท็อปที่จะตัดสินใจ
KHibma

2
@Roland ดังนั้นฉันทดสอบสองสามสิ่งเพิ่มเติมหลังจากคุยกับเพื่อนร่วมงาน ฉันไม่มี 10.0 กับ DT / AGS ในเครื่องเดียวกันดังนั้นฉันไม่รู้ว่ามันจะเป็นอย่างไร แต่ลองใช้ "arcpy.ProductInfo ()" มันบอกคุณ ArcINFO หรือ ArcSERVER ... สิ่งนี้อาจทำเพื่อคุณถ้าคุณกำลังทำงานบน DT หรือสคริปต์เป็น GP Service ในทั้ง 10.0 และ 10.1
KHibma

1
arcpy.ListInstallations()
[u'desktop', u'engine', u'server']

ดังนั้นคุณสามารถตรวจสอบการติดตั้งคืออะไร อย่างไรก็ตามคุณจะไม่ได้รับมากถ้าทั้ง DT และ Server ติดตั้งในเครื่องเดียวกัน สำหรับฟังก์ชั่นที่จะบอกคุณว่าคุณกำลังใช้อะไรอยู่ไม่มีไม่มี

คิดออกมาดัง ๆ : DT คือ 32 บิตเซิร์ฟเวอร์นั้นเป็น 64 บิต คุณสามารถทำ sys.path และตรวจสอบเวอร์ชันของ Python ที่กำลังใช้งานอยู่

หรือ

ถ้าคุณรู้ว่ามันทำงานเป็น GP Service (ไม่ใช่แค่ใช้ python ของเซิร์ฟเวอร์) กับ DT คุณสามารถตรวจสอบเส้นทางของ arcpy.env.scratchFolder ในการติดตั้งทั่วไปมันจะดูเหมือน C: \ arcgisserver \ directory \ arcgisjobs \ [service] _gpserver \ [guid] \ ....


และอย่าลืมว่า ArcGIS Desktop 10.1 มีตัวเลือกในการติดตั้งการประมวลผลพื้นหลัง 64 บิตซึ่งติดตั้ง Python 64 บิต
MLowry

วิธีนี้จะไม่เรียก ArcObjects จาก pythonอนุญาตให้คุณเรียกRuntimeManager.ActiveRuntimeหรือไม่
Kirk Kuykendall

2
RuntimeManagerเป็น. NET ไม่ใช่วัตถุ COM
Petr Krebs

C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dllเป็นไลบรารีชนิดที่โหลดได้ที่มีหลายวัตถุเดียวกันคุณสามารถใช้มันจาก comtypes
Jason Scheirer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.