能否检测出它是在桌面还是服务器上运行?


9

我正在开发一些既要作为ArcGIS Server Web服务又要作为独立脚本运行的代码。我希望能够略微修改执行方式,具体取决于它是作为AGS Web服务运行还是作为独立的python /在桌面中运行。

有没有办法检测到这一点?

我已经做了一些搜索,但是还没有找到满意的结果。我已经看到了arcpy.mapping.CreateGISServerConnectionFile,但是它设置了到服务器的连接,而不是检查当前环境。我还寻找了有关如何在AGS中运行服务的信息(例如this),但是我并没有真正看到arcpy.isWebService()函数类型的任何东西。我是否仅需要检查环境(例如查看是否已设置“%scratchFolder%或检查与sys.argv相关的内容”)?似乎是一种不稳定的解决方案。

Answers:


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()都将产生相似的信息(即使一个产生“ Desktop”,而另一个产生“ ArcInfo”)。我在想arcpy.ProductInfo()选项是最简洁易读的选项。
罗兰2013年

尚未测试过,但是如果您没有使用“ import arceditor”专门导入它,productinfo可能会为您提供最高的可用许可证级别)。意味着如果只有ArcEditor可用,那您可能会回来的。有趣的是服务器没有做同样的事情,因为它还支持多个许可证级别(基本,标准,企业)
Curtis Price

应该注意的是,此Python代码假定该软件是使用常规文件夹命名约定安装的。这是很罕见的人不使用默认的文件夹名称“Desktop10.1” EVN如果他们可以左右移动路径(例如,我们安装到“C:\ ArcGIS的\ Desktop10.1。”
柯蒂斯价格

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中以“ Desktop”形式返回,因此最好使用if语句使用d ['ProductName']。lower()。
罗兰

您可以在服务器上发布结果吗?可能对将来的参考很有用。
Petr Krebs 2013年

绝对是 抱歉耽搁了。必须经过运行AGS安装的我的同事。在10.1以下,他获得了“服务器”。我们没有10.0 AGS实例,但是通过某种大小写函数运行结果可能是一个好主意。
罗兰2013年

我忘记了arcpy.GetInstallInfo()。尽管它的目的不是要告诉您运行的是什么(它的作用与ListInstallations相同...我相信,当从32位运行时,它仅返回engine | desktop;从64位Python运行时,仅返回服务器。重新回到10.0(如您的消息中所示),您将拥有服务器和台式机的决定权
KHibma 2013年

2
@Roland,所以与同事交谈后我又测试了几件事。我在同一机器上没有DT / AGS的10.0,所以我不知道如何进行,但是尝试“ arcpy.ProductInfo()”。它会告诉您ArcINFO或ArcSERVER ...如果您是在DT上运行,还是在10.0和10.1中
KHibma 2013年

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

因此,您可以检查安装了什么。但是,如果DT和服务器都安装在同一台计算机上,这不会使您走得太远。至于告诉您正在运行什么的功能,不存在。

大声思考:DT是32位,服务器是64位。您可以执行sys.path并检查正在使用哪个版本的Python。

要么

如果您知道它作为GP服务运行(而不只是使用服务器的python)还是DT,则可以检查arcpy.env.scratchFolder的路径。在典型安装中,它将始终看起来像C:\ arcgisserver \ directories \ arcgisjobs \ [service] _gpserver \ [guid] \...。


并且不要忘记,ArcGIS Desktop 10.1具有安装64位背景地理处理的选项,该选项将安装Python 64位。
M.Lowry 2013年


2
RuntimeManager是.NET,不是COM对象。
Petr Krebs 2013年

C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dll是一个具有许多相同对象的可加载类型库,您可以从comtypes中使用它。
詹森·谢里尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.