Fazendo instalação separada do Python que pode chamar ArcPy?

28

Eu vejo muitas perguntas e respostas perguntando como você pode criar uma instalação Python separada (por exemplo, a distribuição Anaconda ou Python XY) que pode usar o arcpy, sem "quebrar" a instalação original do python do ArcGIS.

Eu tive esse mesmo problema e acho que encontrei uma solução 'universal'. Até agora, fizemos isso em cerca de 8 computadores no trabalho e tudo funciona bem.

Como instalar uma distribuição Python separada que pode usar o ArcGIS?

James
fonte

Respostas:

37

Criei um módulo pequeno (e relativamente popular) que dispara e procura o ArcGIS no seu PC. Uma vez encontrado, ele adiciona os caminhos corretos ao ambiente para que você possa importar o arcpy. O uso é assim:

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

O módulo está hospedado no github aqui: https://github.com/JamesRamm/archook

É muito simples e tenho certeza que pode ser mais robusto, mas funciona. Está disponível no pypi:pip install archook

Tem algumas vantagens sobre o método original mais 'manual' (detalhado abaixo):

  1. Você não precisa configurar cada ambiente python separadamente ... basta importar o módulo e pronto
  2. Ele não edita / cria nenhuma chave do registro ou variáveis ​​de ambiente permanentes, portanto não chance de atrapalhar nenhuma configuração python / arcgis existente.
  3. Você não precisa saber nada sobre caminhos para várias pastas / arquivos, nem mesmo qual versão do arcgis você instalou. O módulo encontrará tudo para você.
  4. Não é necessária autenticação de administrador
  5. Não é específico com o anaconda - ele funcionará com qualquer instalação python

Deixei a resposta original abaixo, mas esta solução é (IMO) 100% melhor.


2014 resposta

Ok, então esta resposta funciona para a distribuição Anaconda 64bit Python com ArcGIS 10.1 64bit no Windows 7 / Windows Server. Algumas das dicas (ou todas) fornecidas abaixo podem ser aplicadas a qualquer outra distribuição do python para janelas. Primeiro, instale o anaconda, ele deve ir para o diretório C: \ Anaconda. Marque a caixa 'tornar o sistema python padrão'. Pode avisar que há outro python instalado, mas continue. Então:

Caminhos de instalação e variáveis ​​de ambiente

A primeira coisa a fazer é copiar o arquivo DTBGGP64.pth para o novo diretório de distribuição ( C: \ Anaconda ) de C: \ Python27 \ ArcGISx6410.1 \ Lib \ site-packages . A nomeação é arbitrária, mas deve ter a extensão .pth. Isso permitirá que você importe o ArcPy ao usar a nova distribuição. Nota: O local correto do arquivo DTBGGP64.pth deve estar no diretório de pacotes do site (por exemplo, C: \ Anaconda \ Libs \ site-packages ). Eu descobri que em algumas versões mais antigas do Anaconda, ele funciona se estiver no diretório de nível superior. Em seguida, as variáveis ​​de ambiente devem ser verificadas: Na variável de sistema Path, o caminho existente para o diretório python deve ser substituído pelo novo caminho. (por exemplo, C: \ Anaconda; C: \ Anaconda \ Scripts; ) Isso mostrará às janelas onde está o diretório python padrão. Verifique se a variável de usuário PYTHONPATH também está correta. Isso deve apontar para quaisquer bibliotecas que você deseja usar que não sejam descritas por arquivos .pth ou instaladas nos pacotes de sites . IE, podem ser seus próprios pacotes de desenvolvimento ou pacotes como o mapnik, que possuem um local de instalação diferente.

Verifique as configurações do registro

Em algumas máquinas, as opções acima podem ser suficientes para garantir que você possa usar o arcpy do novo python e que o python possa ser usado no ArcGIS. Em outras máquinas, pode ser necessário verificar as chaves do registro. As seguintes chaves do Registro têm configurações de python:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Python \ PythonCore \ 2.7 \ PythonPath
Deve haver uma chave e seu 'valor deve ser C: \ Anaconda \ Lib; C: \ Anaconda \ DLLs (ou as pastas correspondentes para a instalação do python)

HKEY_LOCAL_MACHINE \ SOFTWARE \ Python \ PythonCore \ 2.7 \ InstallPath
A chave deve ser C: \ Anaconda

Você pode ter outras versões python instaladas ... nesse caso, altere o número da versão nos caminhos acima

HKEY_CLASSES_ROOT \ Python.CompiledFile \ DefaultIcon Esse é o local do arquivo .ico para usar nos arquivos .pyc

Comando HKEY_CLASSES_ROOT \ Python.CompiledFile \ shell \ open \ Este é o comando a ser emitido ao abrir um arquivo .pyc no shell. Você deve alterar o python.execaminho para o local da sua versão python desejada

HKEY_CLASSES_ROOT \ Python.File As chaves aqui são as mesmas que para Python.CompiledFile, exceto que elas se aplicam a um arquivo .py. Mais uma vez, faça as alterações relevantes. Pode ter uma chave extra para 'Editar com IDLE' ou 'Editar com Pythonwin'. Novamente, faça as alterações relevantes para que os caminhos nessas chaves aponte para a versão desejada do python.

HKEY_CLASSES_ROOT \ Python.NoConFile São os mesmos que para Python.File, mas devem apontar para o pythonw.exeprograma, quando apropriado.

HKEY_LOCAL_MACHINE \ SOFTWARE \ ESRI \ Python10.1
A chave PythonDir aponta para a instalação do python a ser usada no ArcMap, etc. Ele pode exigir outras mudanças se você apontar ArcMap para a nova instalação python. Não pode haver problemas com as versões de pacotes (por exemplo, numpy) instalados pela nova distribuição. Eu não encontrei nenhum.

Para a maioria do meu trabalho, isso é irrelevante, pois normalmente quero usar o python por conta própria e ocasionalmente ter acesso ao arcpy. Eu raramente desejo usar python de dentro do arcmap. Portanto, fiz poucos testes nesta etapa final, mas parece funcionar para tudo o que tentei até agora.

Eu imagino que o processo seria semelhante para instalar o Python (x, y) etc.

Outras notas

O conteúdo do arquivo .pth é uma lista de caminhos que apontam para as seguintes pastas na instalação do ArcGIS: bin64, arcpy, ArcToolbox \ Scripts Por exemplo, meu arquivo .pth contém o seguinte:

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
fonte
Isso instala todas as dependências do Python que o ArcGIS possui? matplotlib, numpy, xlrd, xlwt e dateutil?
KHibma
Sim. Para a distribuição do anaconda, uma lista completa de pacotes pode ser encontrada aqui: docs.continuum.io/anaconda/pkgs.html Eu não estou tão familiarizado com Python (x, y) ou outras distribuições
James
2
Não esqueça que o ArcGIS (10.2 e 10.1) possui requisitos de versão muito específicos para o numpy - deve ser 1.6.1 ou você pode quebrar o arcpy.
user2856
1
Por favor, adicione o conteúdo do arquivo DTBGGP64.pth! Muitos usuários não parecem ter isso. :)
mmann1123
1
Um recurso realmente interessante do anaconda é que você pode configurá-lo com ambientes virtuais com as versões necessárias para o ArcGIS ou qualquer outro pacote. Por exemplo, você pode ter um ambiente virtual configurado para trabalhar com o ArcGIS que possui as versões que as ferramentas da Esri esperam e outro que não inclua o arcpy ao trabalhar totalmente fora do arcgis.
Curtis Preço
5

Minha solução é configurar um script de inicialização que defina o caminho com base no ambiente python que você está usando. Este método tem a (enorme) vantagem de que você não precisa de acesso de administrador para gravar arquivos .pth em instalações python. Este script está configurado para usar o Anaconda de 32 e 64 bits e o 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
Preço de Curtis
fonte
Como você está configurando / chamando esse script de inicialização para virtualenv em outros scripts .py? por exemplo, se você tiver apenas um script .py que é "arcpy.CopyFeatures_management ('myinput.shp', 'myoutput.shp')"? Exemplo simplificado, é claro. Thx para qualquer conselho
AlexS1 17/07
3

Caso alguém esteja tentando fazer isso usando o ArcGIS Pro (por exemplo, com python 3 em vez de python 2):

Eu uso o spyder no pacote anaconda. A maneira como eu consegui isso funcionou foi em Ferramentas> Intérprete Python no Spyder, apontando o Spyder para o arquivo propy.bat atualmente localizado em C: \ Arquivos de programas \ ArcGIS \ Pro \ bin \ Python \ Scripts \ propy.bat.

Isso ativa a versão correta do python no Spyder e permite importar o arcpy.

T Lynch
fonte
1

Eu uso o código a seguir para configurar um ambiente virtual separado , contendo arcpy e suas dependências:

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
fonte