arcpyがデスクトップとサーバーのどちらで実行されているかを検出できますか?


9

ArcGIS Server Webサービスとスタンドアロンスクリプトの両方として実行するコードを開発しています。AGS Webサービスとして実行されているか、スタンドアロンのpython / within Desktopとして実行されているかに応じて、実行をわずかに変更できるようにしたい。

これを検出する方法はありますか?

いくつか検索を行いましたが、満足できるものは何も見つかりませんでした。私が見てきたarcpy.mapping.CreateGISServerConnectionFileを、しかし、現在の環境をチェックするとは対照的に、サーバにこのセットを接続。また、AGSでサービスがどのように実行されるかについての情報(たとえばthis)も探しましたが、arcpy.isWebService()タイプの関数の行に沿って何も表示されません。環境をチェックするだけでよいですか(「%scratchFolder%が設定されているかどうか、またはsys.argvに関連するものを調べているかどうか」など)?不安定なソリューションのようです。

回答:


5

sys.executable、a​​rcpy.GetInstallInfo()、ListInstallations()、およびProductInfo()の結果を確認した後、私はこれを提案しましたが、どのarcpyを実行しているかについては、どれも私に良い答えを与えませんでした。@ KHibma、arcpyチームが考慮すべき何か-sys.versionのような(pypy.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()はすべて同じような情報を生成します(一方が「デスクトップ」を生成し、他方が「ArcInfo」を生成する場合でも)。arcpy.ProductInfo()オプションが最も簡潔で読みやすいオプションだと思います。
Roland

まだテストしていませんが、「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の「デスクトップ」として復活したことに気付いたので、ifステートメントでd ['ProductName']。lower()を使用する方がよいでしょう。
Roland

サーバーに結果を投稿できますか?将来の参考に役立ちます。
Petr Krebs 2013年

間違いなく。遅れて申し訳ありません。AGSインストールを実行している私の同僚を経由する必要がありました。10.1未満では、「サーバー」を取得しました。10.0 AGSインスタンスはありませんが、何らかの大文字化関数を使用して結果を実行することは、おそらく良い考えです。
Roland

arcpy.GetInstallInfo()のことを忘れていました。その目的は、実行しているものを伝えることではありませんが(ListInstallationsとほとんど同じように機能します... 32ビットから実行するとengine | desktopを返し、64ビットPythonから実行するとサーバーを返すだけだと思います。メッセージに表示されているように、10.0に戻ります。サーバーとデスクトップの両方で決定する必要があります
KHibma

2
@Rolandなので、同僚と話をした後、いくつかのことをテストしました。同じマシンにDT / AGSの10.0がないので、どうなるかわかりませんが、 "arcpy.ProductInfo()"を試してください。これは、ArcINFOまたはArcSERVERを通知します。DTで実行している場合、またはスクリプトがGPサービスとして10.0と10.1の両方で実行されている場合、実際にはそれが行われる可能性があります
KHibma

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

インストールされているもののチェックを行うことができます。ただし、DTとサーバーの両方が同じマシンにインストールされている場合は、それほど遠くまでは行きません。何を実行しているのかを通知する関数については、いいえ、存在しません。

大声で考える:DTは32ビット、サーバーは64ビットです。sys.pathを実行して、使用されているPythonのバージョンを調べることができます。

または

(サーバーのpythonを使用するだけでなく)GPサービスとして実行されていることとDTがわかっている場合は、arcpy.env.scratchFolderのパスを調べることができます。通常のインストールでは、常にC:\ arcgisserver \ directories \ arcgisjobs \ [service] _gpserver \ [guid] \ ....のようになります。


また、ArcGIS Desktop 10.1には、Python 64ビットをインストールする64ビットバックグラウンドジオプロセシングをインストールするオプションがあることを忘れないでください。
MLowry


2
RuntimeManager.NETであり、COMオブジェクトではありません。
Petr Krebs 2013年

C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dll同じオブジェクトの多くを含むロード可能なタイプライブラリで、comtypeから使用できます。
Jason Scheirer 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.