制作可调用ArcPy的单独Python安装?


28

我看到很多问答,询问您如何创建可以使用arcpy而又不“破坏”原始ArcGIS python安装的单独Python安装(例如Anaconda或Python XY发行版)。

我遇到了同样的问题,我想我已经找到了“通用”解决方案。到目前为止,我们已经在大约8台工作的计算机上完成了此操作,并且一切正常。

如何安装可以使用ArcGIS的单独的Python发行版?

Answers:


37

我创建了一个小模块(相对流行),该模块可以在PC上搜索ArcGIS。找到后,它将为环境添加正确的路径,以便您可以导入arcpy。用法如下:

try:
    import archook #The module which locates arcgis
    archook.get_arcpy()
    import arcpy
except ImportError:
    # do whatever you do if arcpy isnt there.

该模块托管在github上:https : //github.com/JamesRamm/archook

它非常简单,而且我敢肯定它可以变得更强大,但确实可以做到。它在pypi上可用:pip install archook

与更“手动”的原始方法(详细信息如下)相比,它具有一些优点:

  1. 您不需要分别配置每个python环境...只需导入模块即可
  2. 它不会编辑/创建任何注册表项或永久环境变量,因此没有任何混乱现有的python / arcgis配置的机会。
  3. 您无需了解各种文件夹/文件的路径,甚至无需了解已安装的Arcgis版本。该模块将为您找到所有内容。
  4. 无需管理员身份验证
  5. 它不是特定于anaconda的-它可以与任何python安装一起使用

我在下面留下了原始答案,但是此解决方案(IMO)更好100%。


2014年答案

好的,因此此答案适用于Windows 7 / Windows Server上具有ArcGIS 10.1 64bit的Anaconda 64位Python发行版。以下给出的一些(或全部)技巧可能适用于python的任何其他Windows发行版。首先,安装anaconda,它应该转到目录C:\ Anaconda。选中“将系统设为默认python”框。它可能会警告您安装了另一个python,但请继续。然后:

设置路径和环境变量

首先要做的是从C:\ Python27 \ ArcGISx6410.1 \ Lib \ site-packagesDTBGGP64.pth文件复制到新的分发目录(C:\ Anaconda)。命名是任意的,但必须具有.pth扩展名。这将允许您在使用新发行版时导入ArcPy。 注意:DTBGGP64.pth文件的正确位置应该在site-packages目录中(例如C:\ Anaconda \ Libs \ site-packages)。我发现对于某些较旧版本的Anaconda,如果位于顶层目录中 ,则可以使用。接下来,必须检查环境变量:在系统变量Path中,则python目录的现有路径应替换为新路径。(例如C:\ Anaconda; C:\ Anaconda \ Scripts;)这将告诉Windows默认python目录在哪里。确保用户变量PYTHONPATH也正确。这应该指向您希望使用的任何库,这些库未由.pth文件描述或未安装在site-packages中。IE可能是您自己的开发包,也可能是Mapnik等安装位置不同的软件包。

检查注册表设置

在某些计算机上,上述内容可能足以确保您可以使用新python中的arcpy,并且可以在ArcGIS中使用python。在其他计算机上,您可能需要检查注册表项。以下注册表项具有python设置:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Python \ PythonCore \ 2.7 \ PythonPath
应该有一个密钥,其值应为C:\ Anaconda \ Lib; C:\ Anaconda \ DLLs (或python安装的相应文件夹)

HKEY_LOCAL_MACHINE \ SOFTWARE \ Python \ PythonCore \ 2.7 \ InstallPath
密钥应为C:\ Anaconda

您可能安装了其他python版本...在这种情况下,请更改上述路径中的版本号

HKEY_CLASSES_ROOT \ Python.CompiledFile \ DefaultIcon 这是用于.pyc文件的.ico文件的位置

HKEY_CLASSES_ROOT \ Python.CompiledFile \ shell \ open \ command 这是从shell打开.pyc文件时要发出的命令。您应该将python.exe路径更改为所需python版本的位置

HKEY_CLASSES_ROOT \ Python.File 此处的键与Python.CompiledFile的键相同,只不过它们适用于.py文件。再次,进行相关更改。它可能具有用于“使用IDLE编辑”或“使用Pythonwin编辑”的额外密钥。再次,进行相关更改,以使这些键中的路径指向所需的python版本。

HKEY_CLASSES_ROOT \ Python.NoConFile 这些与Python.File相同,但应pythonw.exe在适当的地方指向该程序。

HKEY_LOCAL_MACHINE \ SOFTWARE \ ESRI \ Python10.1
PythonDir关键点蟒蛇安装在ArcMap等使用。你可能希望通过ESRI作为安装此作为矢志不渝的Python安装,或将其指向新安装。如果将ArcMap指向新的python安装,则可能需要进行其他更改。有可能是与包通过新的分销安装的版本(如numpy的)问题。我还没有遇到。

在我的大部分工作中,这是无关紧要的,因为我通常想自己使用python,偶尔也可以访问arcpy。我很少希望在arcmap中使用python。因此,我没有对最后一步做任何测试,但对于到目前为止我尝试过的一切似乎都可以使用。

我认为安装Python(x,y)等的过程将是相似的。

其他注意事项

.pth文件的内容是指向ArcGIS安装中以下文件夹的路径的列表:bin64,arcpy,ArcToolbox \ Scripts例如,我的.pth文件包含以下内容:

C:\Program Files (x86)\ArcGIS\Desktop10.2\bin64
C:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy
C:\Program Files (x86)\ArcGIS\Desktop10.2\ArcToolbox\Scripts


这会安装ArcGIS具有的所有Python依赖项吗?matplotlib,numpy,xlrd,xlwt和dateutil?
KHibma 2014年

是。对于anaconda发行版,可以在这里找到完整的软件包列表:docs.continuum.io/anaconda/pkgs.html我对Python(x,y)或其他发行版不熟悉
James

2
不要忘了ArcGIS(10.2和10.1)对numpy 有非常特定的版本要求 -必须为1.6.1,否则您可以破坏arcpy。
user2856

1
请添加DTBGGP64.pth文件的内容!许多用户似乎没有这个。:)
mmann1123 2014年

1
anaconda的一个非常好的功能是您可以使用ArcGIS或任何其他软件包所需的版本在虚拟环境中进行设置。例如,您可以设置一个虚拟环境以与ArcGIS一起使用,该虚拟环境具有Esri工具所期望的版本,而另一个完全不在arcgis内工作时不包含arcpy的版本。
柯蒂斯价格

5

我的解决方案是设置一个启动脚本,该脚本根据您使用的python环境设置路径。该方法具有(巨大)优点,即您无需管理员权限即可在python安装中写入.pth文件。该脚本设置为同时使用32位和64位Anaconda和ArcGIS / arcpy。

    # Startup script to link Anaconda python environment with ArcGIS
    #
    # 1. Install Anaconda, setup environment to match your ArcGIS version
    # 2. Edit the paths below
    # 3. Put this startup script in the startup folder as "usercustomize.py"
    #    Startup folder can be found with: "C:\Python27\ArcGIS10.2\python -m site --user-site"
    #    Usually will be:
    # C:\Users\%USERNAME%\AppData\Roaming\Python\Python27\site-packages

    import sys
    import os

    # edit these paths to match your setup
    arcver = "10.2"
    # Anaconda home folders
    conda32 = r"D:\Users\cprice\Anaconda"
    conda64 = r"D:\Users\cprice\Anaconda64"
    # here are the conda environments you've set up use with ArcGIS
    # arc1022 is the environment setup for ArcGIS
    conda_env32 = "{}/envs/{}".format(conda32, "arc1022")
    conda_env64 = "{}/envs/{}".format(conda64, "arc1022")

    # do not edit below this line

    # ArcGIS Python home folders
    # i.e. C:\Python27\ArcGIS10.2
    arcver = arcver[:4]
    arcpy32 = r"C:\Python27\ArcGIS{}".format(arcver)
    arcpy64 = r"C:\Python27\ArcGISx64{}".format(arcver)

    try:
        if sys.version.find("64 bit") < 0:
            conda_path = os.path.normpath(conda_env32)
            arcpy_path = os.path.normpath(arcpy32)
            arcpy_pthfile = os.path.normpath(
                arcpy_path + "/lib/site-packages/desktop{}.pth".format(arcver))
        else:
            conda_path = os.path.normpath(conda_env64)
            arcpy_path = os.path.normpath(arcpy64)
            arcpy_pthfile = os.path.normpath(
                arcpy_path + "/lib/site-packages/DTBGGP64.pth")

        for p in [conda_path, arcpy_path, arcpy_pthfile]:
            if not os.path.exists(p):
                raise Exception("{} not found".format(p))

        ## print(sys.prefix)
        ## print(conda_path)

        # If running ArcGIS's Python, add conda modules to path
        if (sys.executable.lower().find("desktop" + arcver) != -1
            or sys.prefix.lower().find("arcgis10") != -1):
            sys.path.append(os.path.dirname(arcpy_path))
            conda_site = os.path.join(conda_path, "lib", "site-packages")
            if not os.path.isdir(conda_site):
                raise Exception()
            sys.path.append(conda_site)
            print("usercustomize.py: added conda paths to arc")

        # if running Anaconda add arcpy to path
        elif sys.prefix.lower() == conda_path.lower():
            with open(arcpy_pthfile, "r") as f:
                sys.path +=  [p.strip() for p in f.readlines()]
            print("usercustomize.py: added arcpy paths to conda")

    except Exception as msg:
        print(msg)
        pass

您如何在其他.py脚本中为virtualenv设置/调用此strartup脚本?例如,如果您只有一个.py脚本“ arcpy.CopyFeatures_management('myinput.shp','myoutput.shp')”?当然是简化的例子。
谢谢

3

如果有人尝试使用ArcGIS Pro(例如,使用python 3而不是python 2)来执行此操作:

我在anaconda包中使用了spyder。我使用此方法的方法是转到Spyder中的“工具”>“ Python解释器”,然后将Spyder指向当前位于C:\ Program Files \ ArcGIS \ Pro \ bin \ Python \ Scripts \ propy.bat的propy.bat文件。

这会在Spyder中激活正确的python版本,并允许您导入arcpy。


1

我使用以下代码来设置一个单独的虚拟环境,其中包含arcpy及其依赖项:

set "VENV_PATH=C:\VirtualEnvs\MyArcPyEnv"
set "PYTHON=C:\Python27\ArcGIS10.3"

mklink /J %VENV_PATH%\Lib\site-packages\arcpy "C:\Program Files (x86)\ArcGIS\Desktop10.3\arcpy\arcpy"
mklink /J %VENV_PATH%\Lib\site-packages\numpy %PYTHON%\Lib\site-packages\numpy

mklink /J %VENV_PATH%\Lib\site-packages\matplotlib C:\Python27\ArcGIS10.3\Lib\site-packages\matplotlib
mklink /J %VENV_PATH%\Lib\site-packages\dateutil %PYTHON%\Lib\site-packages\dateutil
mklink /J %VENV_PATH%\Lib\site-packages\mpl_toolkits %PYTHON%\Lib\site-packages\mpl_toolkits

copy %PYTHON%\Lib\site-packages\pyparsing.py  %VENV_PATH%\Lib\site-packages
copy %PYTHON%\Lib\site-packages\pylab.py %VENV_PATH%\site-packages
copy %PYTHON%\Lib\site-packages\netcdftime.py %VENV_PATH%\Lib\site-packages
copy %PYTHON%\Lib\site-packages\netCDF4_utils.py %VENV_PATH%\Lib\site-packages

REM Only one of the following .pth files will exist (dependent on x64 or x32)

copy %PYTHON%\Lib\site-packages\Desktop10.3.pth %VENV_PATH%\Lib\site-packages
copy %PYTHON%\Lib\site-packages\DTBGGP64.pth %VENV_PATH%\Lib\site-packages
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.