¿Realiza una instalación de Python por separado que puede llamar a ArcPy?

28

Veo muchas preguntas y respuestas que preguntan cómo puede crear una instalación de Python separada (por ejemplo, la distribución Anaconda o Python XY) que puede usar arcpy, sin 'romper' la instalación original de Python de ArcGIS.

Tuve el mismo problema y creo que he encontrado una solución 'universal'. Hasta ahora hemos hecho esto en aproximadamente 8 computadoras en el trabajo y todo funciona bien.

¿Cómo instalar una distribución de Python separada que puede usar ArcGIS?

James
fuente

Respuestas:

37

Creé un módulo pequeño (y relativamente popular) que se activa y busca ArcGIS en su PC. Una vez que encuentre, agrega las rutas correctas al entorno para que pueda importar arcpy. El uso es así:

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

El módulo está alojado en github aquí: https://github.com/JamesRamm/archook

Es muy simple y estoy seguro de que puede hacerse más robusto, pero hace el trabajo. Está disponible en pypi:pip install archook

Tiene algunas ventajas sobre el método original más 'manual' (detallado a continuación):

  1. No necesita configurar cada entorno de Python por separado ... solo importe el módulo y listo.
  2. No edita / crea claves de registro o variables de entorno permanentes, por lo que no hay posibilidad de estropear ninguna configuración existente de python / arcgis.
  3. No necesita saber nada sobre las rutas a varias carpetas / archivos, o incluso qué versión de arcgis ha instalado. El módulo lo encontrará todo por ti.
  4. No se necesita autenticación de administrador
  5. No es específico con anaconda: funcionará con cualquier instalación de Python

He dejado la respuesta original a continuación, pero esta solución es (IMO) 100% mejor.


Respuesta 2014

Ok, entonces esta respuesta funciona para la distribución Python Anaconda de 64 bits con ArcGIS 10.1 64 bits en Windows 7 / Windows Server. Algunos de (o todos) los consejos que se dan a continuación pueden aplicarse a cualquier otra distribución de Windows de Python. Primero, instale anaconda, debe ir al directorio C: \ Anaconda. Marque la casilla 'hacer que Python sea el sistema predeterminado' Puede dar una advertencia de que hay otro python instalado, pero continúe. Luego:

Configurar rutas y variables de entorno

Lo primero que debe hacer es copiar el archivo DTBGGP64.pth al nuevo directorio de distribución ( C: \ Anaconda ) desde C: \ Python27 \ ArcGISx6410.1 \ Lib \ site-packages . La denominación es arbitraria, pero debe tener la extensión .pth. Esto le permitirá importar ArcPy cuando utilice la nueva distribución. Nota: La ubicación correcta del archivo DTBGGP64.pth debe estar en el directorio de paquetes del sitio (por ejemplo, C: \ Anaconda \ Libs \ site-packages ). He encontrado que con algunas versiones anteriores de Anaconda, funciona si se encuentra en el directorio de nivel superior. Luego, las variables de entorno deben ser verificadas: en la ruta del variable, la ruta existente al directorio de Python debe reemplazarse con la nueva ruta. (por ejemplo, C: \ Anaconda; C: \ Anaconda \ Scripts; ) Esto le dirá a Windows dónde está el directorio predeterminado de Python. Asegúrese de que la variable de usuario PYTHONPATH también sea correcta. Esto debería apuntar a cualquier biblioteca que desee usar que no esté descrita por archivos .pth o que esté instalada en paquetes de sitio . Es decir, estos pueden ser sus propios paquetes de desarrollo o paquetes como mapnik que tienen una ubicación de instalación diferente.

Comprobar la configuración del registro

En algunas máquinas, lo anterior puede ser suficiente para garantizar que pueda usar arcpy desde la nueva python y que python se pueda usar dentro de ArcGIS. En otras máquinas, es posible que deba verificar las claves de registro. Las siguientes claves de registro tienen configuraciones de python:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Python \ PythonCore \ 2.7 \ PythonPath
Debe haber una clave y su 'valor debe ser C: \ Anaconda \ Lib; C: \ Anaconda \ DLLs (o las carpetas correspondientes para su instalación de Python)

HKEY_LOCAL_MACHINE \ SOFTWARE \ Python \ PythonCore \ 2.7 \ InstallPath
La clave debe ser C: \ Anaconda

Es posible que tenga otras versiones de Python instaladas ... en cuyo caso cambie el número de versión en las rutas anteriores

HKEY_CLASSES_ROOT \ Python.CompiledFile \ DefaultIcon Esta es la ubicación del archivo .ico que se utilizará para los archivos .pyc

HKEY_CLASSES_ROOT \ Python.CompiledFile \ shell \ open \ command Este es el comando que debe emitirse al abrir un archivo .pyc desde el shell. Debe cambiar la python.exeruta a la ubicación de la versión de Python que desee.

HKEY_CLASSES_ROOT \ Python.File Las claves aquí son las mismas que las de Python.CompiledFile, excepto que se aplican a un archivo .py. Nuevamente, haga los cambios relevantes. Puede tener una clave adicional para 'Editar con IDLE' o 'Editar con Pythonwin'. Nuevamente, realice los cambios relevantes para que las rutas en estas claves apunten a la versión de Python deseada.

HKEY_CLASSES_ROOT \ Python.NoConFile Estos son los mismos que para Python.File, pero deben apuntar al pythonw.exeprograma cuando corresponda.

HKEY_LOCAL_MACHINE \ SOFTWARE \ ESRI \ Python10.1
La clave PythonDir apunta a la instalación de Python para usar dentro de ArcMap, etc. Puede desear que esto permanezca como la instalación de Python instalada por ESRI, o apunte a su nueva instalación. Se puede requerir otros cambios si apunta ArcMap para la nueva instalación de Python. No puede haber problemas con las versiones de los paquetes (por ejemplo numpy) instalados por la nueva distribución. No he encontrado ninguno.

Para la mayoría de mi trabajo, esto es irrelevante, ya que normalmente quiero usar Python solo y ocasionalmente tener acceso a arcpy. Rara vez deseo usar Python desde arcmap ... Por lo tanto, he realizado pocas pruebas de este paso final, pero parece funcionar para todo lo que he intentado hasta ahora.

Me imagino que el proceso sería similar para instalar Python (x, y) etc.

Otras notas

El contenido del archivo .pth es una lista de rutas que apuntan a las siguientes carpetas en su instalación de ArcGIS: bin64, arcpy, ArcToolbox \ Scripts Por ejemplo, mi archivo .pth contiene lo siguiente:

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

James
fuente
¿Instala esto todas las dependencias de Python que tiene ArcGIS? matplotlib, numpy, xlrd, xlwt y dateutil?
KHibma
Sí. Para la distribución de anaconda, puede encontrar una lista completa de paquetes aquí: docs.continuum.io/anaconda/pkgs.html No estoy tan familiarizado con Python (x, y) u otras distribuciones
James
2
No olvide que ArcGIS (10.2 y 10.1) tiene requisitos de versión muy específicos para numpy: debe ser 1.6.1 o puede romper arcpy.
usuario2856
1
¡Agregue el contenido del archivo DTBGGP64.pth! Muchos usuarios no parecen tener esto. :)
mmann1123
1
Una característica realmente agradable de anaconda es que puede configurarlo en entornos virtuales con las versiones que necesita para ArcGIS o cualquier otro paquete. Por ejemplo, podría tener un entorno virtual configurado para trabajar con ArcGIS que tenga las versiones que las herramientas de Esri esperan, y otro que no incluya arcpy cuando trabaje totalmente fuera de arcgis.
Curtis Precio
5

Mi solución es configurar un script de inicio que establezca la ruta en función del entorno de Python que está utilizando. Este método tiene la ventaja (enorme) de que no necesita acceso de administrador para escribir archivos .pth en instalaciones de Python. Este script está configurado para usar Anaconda y ArcGIS / arcpy de 32 bits y 64 bits.

    # 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
Precio Curtis
fuente
¿Cómo está configurando / llamando a este script de inicio para virtualenv en otros scripts .py? por ejemplo, si solo tiene un script .py que es "arcpy.CopyFeatures_management ('myinput.shp', 'myoutput.shp')"? Ejemplo simplificado, por supuesto. Gracias por cualquier consejo
AlexS1
3

En caso de que alguien esté tratando de hacer esto usando ArcGIS Pro (es decir, con Python 3 en lugar de Python 2):

Yo uso spyder dentro del paquete anaconda. La forma en que conseguí que esto funcionara fue yendo a Herramientas> Python Interpreter en Spyder, luego señalando Spyder al archivo propy.bat actualmente ubicado en C: \ Archivos de programa \ ArcGIS \ Pro \ bin \ Python \ Scripts \ propy.bat.

Esto activa la versión correcta de Python en Spyder y le permite importar arcpy.

T Lynch
fuente
1

Utilizo el siguiente código para configurar un entorno virtual separado , que contiene arcpy y sus dependencias:

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
geographika
fuente